/************************************************************************** * 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. * * * * 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. * ***************************************************************************/ /*************************************************************************** * God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock * * * * Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little * * This mud is NOT to be copied in whole or in part, or to be run without * * the permission of Matthew Little. Nobody else has permission to * * authorise the use of this code. * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #define MONK_AUTODROP 11 extern bool nosafe; NCLANS_DATA *nclans_table; /* * Local functions. */ void autodrop args ((CHAR_DATA * ch)); bool check_dodge args ((CHAR_DATA * ch, CHAR_DATA * victim, int dt)); void check_killer args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool check_parry args ((CHAR_DATA * ch, CHAR_DATA * victim, int dt)); void dam_message args ((CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt)); void death_cry args ((CHAR_DATA * ch)); void group_gain args ((CHAR_DATA * ch, CHAR_DATA * victim)); int xp_compute args ((CHAR_DATA * gch, CHAR_DATA * victim)); void set_fighting args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool can_counter args ((CHAR_DATA * ch)); bool can_bypass args ((CHAR_DATA * ch, CHAR_DATA * victim)); int number_attacks args ((CHAR_DATA * ch, CHAR_DATA * victim)); int dambonus args ((CHAR_DATA * ch, CHAR_DATA * victim, int dam, int stance)); int oupdate_damcap args ((CHAR_DATA * ch, CHAR_DATA * victim)); void update_damcap args ((CHAR_DATA * ch, CHAR_DATA * victim)); int add_bonuses args ((CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt)); void rparasite args((void)); extern CHAR_DATA *quest_target; extern CHAR_DATA *quest_mob; /* * Control the fights going on. * Called periodically by update_handler. * */ void violence_update (void) { CHAR_DATA *ch; CHAR_DATA *ch_next; CHAR_DATA *victim; CHAR_DATA *rch; CHAR_DATA *rch_next; CHAR_DATA *mount; int chance; int sn; int level; chance = number_percent (); for (ch = char_list; ch != NULL; ch = ch->next) { /* testing something lets see if ( ch->combined_exp > 0 ) show_combined_exp( ch ); */ if (chance > 60 && ch->position == POS_FIGHTING && IS_CLASS (ch, CLASS_DEMON) && IS_SET (ch->warp, WARP_SCARED)) { do_flee (ch, ""); stc ("You are so scared you flee from combat, COWARD!\n\r", ch); return; } victim = ch->blinkykill; if (ch->blinkykill == NULL) continue; if (IS_SET (ch->flag2, AFF2_BLINK_1ST_RD)) { REMOVE_BIT (ch->flag2, AFF2_BLINK_1ST_RD); SET_BIT (ch->flag2, AFF2_BLINK_2ND_RD); } else if (IS_SET (ch->flag2, AFF2_BLINK_2ND_RD)) { REMOVE_BIT (ch->flag2, AFF2_BLINK_2ND_RD); REMOVE_BIT (ch->flag2, AFF2_BLINK_1ST_RD); if (ch->blinkykill->in_room != ch->in_room) { ch->blinkykill = NULL; act ("$n pops back into existence.", ch, NULL, NULL, TO_ROOM); stc ("You pop back into existence.\n\r", ch); stc ("Your victim is no longer in the room.\n\r", ch); break; } act ("$n pops back into existence next to $N.", ch, NULL, ch->blinkykill, TO_NOTVICT); act ("You pop back into existence next to $N.", ch, NULL, ch->blinkykill, TO_CHAR); act ("$n pops back into existence next to you.", ch, NULL, ch->blinkykill, TO_VICT); set_fighting (ch, ch->blinkykill); if (!is_safe (ch, victim)) { if (ch->hit > 0) { do_say (ch, "Muhahahahahaha"); ch->blinkykill = NULL; multi_hit (ch, victim, gsn_blinky); multi_hit (ch, victim, gsn_blinky); update_pos (victim); } } } } for (ch = char_list; ch != NULL; ch = ch->next) { ch_next = ch->next; if (ch->fight_timer > 0 && ch->fighting == NULL && (IS_NPC(ch) || ch->pcdata->login_timer < 1)) { ch->fight_timer--; if (ch->fight_timer < 1) { send_to_char ("Your fight timer is now clear.\n\r", ch); ch->fight_timer = 0; } } if (IS_SET (ch->flag2, AFF2_FROZEN)) { int break_fail = 60; break_fail -= ch->spl[RED_MAGIC] / 5; if (IS_NPC(ch)) break_fail -= ch->level / 5; if (IS_CLASS (ch, CLASS_DROW)) break_fail -= ch->spl[RED_MAGIC] / 10; if (IS_CLASS (ch, CLASS_MAGE)) break_fail -= ch->spl[RED_MAGIC] / 5; if (IS_CLASS (ch, CLASS_HIGHLANDER)) break_fail -= ch->wpn[1] / 20; if (break_fail < 0) break_fail = 0; else { if ((ch->fighting)) break_fail /= 3; } if (number_range (1, 100) > break_fail) { send_to_char ("The ice around you is so thin you flex your muscles and shatter it.\n\r", ch); act ("The ice around $n shatters revealing one pissed off $n.", ch, NULL, NULL, TO_ROOM); REMOVE_BIT (ch->flag2, AFF2_FROZEN); stop_fighting (ch, FALSE); update_pos (ch); continue; } else { send_to_char ("The ice around you melts a little bit.\n\r", ch); act ("The ice around $n melts a little.", ch, NULL, NULL, TO_ROOM); stop_fighting (ch, FALSE); update_pos (ch); continue; } } if (IS_SET (ch->monkstuff, MONK_DEATH)) { if (ch->hit > (ch->max_hit / 2)) { ch->hit -= number_range (500, 1000); stc ("Your writhe in agony as magical energies tear you asunder.\n\r", ch); act ("$n's writhes in agony as magical forces tear apart $s body.", ch, NULL, NULL, TO_ROOM); } else { if (number_range (1, 2) == 1) { stc ("You feel the magical forces leave your body.\n\r", ch); act ("The magical forces leave $n's body.", ch, NULL, NULL, TO_ROOM); REMOVE_BIT (ch->monkstuff, MONK_DEATH); } else { ch->hit -= number_range (500, 2000); stc ("Your writhe in agony as magical energies tear you asunder.\n\r", ch); act ("$n's writhes in agony as magical forces tear apart $s body.", ch, NULL, NULL, TO_ROOM); } } } if (IS_SET (ch->newbits, NEW_POWER)) { if (ch->move < 75) do_spiritpower (ch, ""); else ch->move -= 25; } /* if (ch->chi[CURRENT] > 0) { if (IS_CLASS (ch, CLASS_MONK) && ch->move > (500 - ch->chi[CURRENT] * 40)) ch->move -= ch->chi[CURRENT] * 40; else { if (ch->chi[CURRENT] > 0) { stc ("You feel exhausted, and lose control of your ch'i.\n\r", ch); ch->chi[CURRENT] -= 1; } } } */ if ((victim = ch->fighting) == NULL || ch->in_room == NULL) continue; /* if ( ( ch->pcdata->obj_vnum != 0 ) || ( victim->pcdata->obj_vnum != 0 ) ) { stop_fighting( ch, FALSE ); continue; } */ if (!IS_NPC (ch) && !IS_NPC (victim) && !is_safe (ch, victim) && !is_safe (victim, ch)) { ch->fight_timer = 30; victim->fight_timer = 30; } if (IS_SET (victim->flag2, AFF2_FROZEN)) { stc ("You chip away at the ice but can do little damage.\n\r", ch); return; } if (IS_AWAKE (ch) && IS_AWAKE (victim) && ch->in_room == victim->in_room) { multi_hit (ch, victim, TYPE_UNDEFINED); } else stop_fighting (ch, FALSE); /* */ if ((victim = ch->fighting) == NULL) continue; if (IS_NPC (ch) || ch->spl[1] < 4) level = ch->level; else level = (ch->spl[1] * 0.25); for (rch = ch->in_room->people; rch != NULL; rch = rch_next) { rch_next = rch->next_in_room; if (IS_ITEMAFF (ch, ITEMA_SOLARSHIELD) && rch->position == POS_FIGHTING && rch->fighting == ch) if ((sn = skill_lookup ("solar flare")) > 0) (*skill_table[sn].spell_fun) (sn, level, ch, rch); if (IS_AWAKE (rch) && rch->fighting == NULL) { if ((mount = rch->mount) != NULL) { if (mount == ch) multi_hit (rch, victim, TYPE_UNDEFINED); continue; } if (!IS_NPC (ch) || IS_AFFECTED (ch, AFF_CHARM)) { if ((!IS_NPC (rch) || IS_AFFECTED (rch, AFF_CHARM)) && is_same_group (ch, rch)) multi_hit (rch, victim, TYPE_UNDEFINED); continue; } if (IS_NPC (rch) && !IS_AFFECTED (rch, AFF_CHARM)) { if (rch->pIndexData == ch->pIndexData || number_bits (3) == 0) { CHAR_DATA *vch; CHAR_DATA *target; int number; target = NULL; number = 0; for (vch = ch->in_room->people; vch; vch = vch->next) { if (can_see (rch, vch) && is_same_group (vch, victim) && number_range (0, number) == 0) { target = vch; number++; } } if (target != NULL) multi_hit (rch, target, TYPE_UNDEFINED); } } } } } return; } /* * Do one group of attacks. */ void multi_hit (CHAR_DATA * ch, CHAR_DATA * victim, int dt) { OBJ_DATA *wield; OBJ_DATA *wield1; OBJ_DATA *wield2; OBJ_DATA *wield3; OBJ_DATA *wield4; int sn; int level; int chance; int unarmed; int wieldorig = 0; int wieldtype = 0; int maxcount; int countup; int wieldie; int breathindex = 0; /*for random dragon breath attacks */ if (ch->position < POS_SLEEPING) return; if (number_attacks (ch, victim) == 0) // no, if you don't get to attacks you don't get to fight. return; if (dt == gsn_spiket) { one_hit (ch, victim, dt, 1); return; } if (dt == gsn_magma) { one_hit (ch, victim, dt, 1); return; } if (dt == gsn_shards) { one_hit (ch, victim, dt, 1); return; } if (dt == gsn_venomt) { one_hit (ch, victim, dt, 1); return; } if (dt == gsn_darktendrils && IS_CLASS (ch, CLASS_DROW)) { one_hit (ch, victim, dt, 1); return; } if (dt == gsn_bodyspikes) { one_hit (ch, victim, dt, 1); return; } if (dt == gsn_headbutt) { one_hit (ch, victim, dt, 1); return; } if (dt == gsn_quills) { one_hit (ch, victim, dt, 1); return; } if (dt == gsn_spiderform) { one_hit (ch, victim, dt, 2); one_hit (ch, victim, dt, 2); one_hit (ch, victim, dt, 4); one_hit (ch, victim, dt, 4); one_hit (ch, victim, dt, 6); one_hit (ch, victim, dt, 6); one_hit (ch, victim, dt, 8); one_hit (ch, victim, dt, 8); return; } if (dt == gsn_tail) { one_hit (ch, victim, dt, 1); return; } if (!IS_NPC (ch) && IS_ITEMAFF (ch, ITEMA_PEACE)) { send_to_char ("You are unable to attack them.\n\r", ch); return; } if (!IS_NPC (victim) && IS_ITEMAFF (victim, ITEMA_PEACE)) { send_to_char ("You can't seem to attack them.\n\r", ch); return; } if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return; } if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_STEELSHIELD)) { send_to_char ("You cannot attack while in majesty.\n\r", ch); return; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_STEELSHIELD)) { send_to_char ("They are protected by a powerful being.\n\r", ch); return; } /* wield1 = get_eq_char(ch, WEAR_WIELD); wield2 = get_eq_char(ch, WEAR_HOLD); if (wield1 != NULL && wield1->item_type == ITEM_WEAPON) wieldorig = 1; if (wield2 != NULL && wield2->item_type == ITEM_WEAPON) wieldorig += 2; wieldtype = wieldorig; */ wield1 = get_eq_char (ch, WEAR_WIELD); wield2 = get_eq_char (ch, WEAR_HOLD); if (wield1 == NULL && wield2 == NULL) wield1 = get_eq_char( ch, WEAR_DUAL); wield3 = get_eq_char (ch, WEAR_THIRD); wield4 = get_eq_char (ch, WEAR_FOURTH); if (wield1 != NULL && wield1->item_type == ITEM_WEAPON) wieldorig = 1; if (wield2 != NULL && wield2->item_type == ITEM_WEAPON) wieldorig += 2; if (wield3 != NULL && wield3->item_type == ITEM_WEAPON) wieldorig += 4; if (wield4 != NULL && wield4->item_type == ITEM_WEAPON) wieldorig += 8; wieldtype = wieldorig; wieldie = number_range (1, 4); if (wieldorig == 15) { if (wieldie == 2) wieldtype = 8; else wieldtype = 4; } if (wieldorig == 14) { if (wieldie == 2) wieldtype = 8; else if (wieldie == 1) wieldtype = 4; else if (wieldie == 3) wieldtype = 2; else wieldtype = 1; } if (wieldorig == 13) { if (wieldie == 1) wieldtype = 8; else if (wieldie == 2) wieldtype = 4; else wieldtype = 1; } if (wieldorig == 12) { if (wieldie == 1) wieldtype = 8; else wieldtype = 4; } if (wieldorig == 11) { if (wieldie == 1) wieldtype = 8; if (wieldie == 2) wieldtype = 2; else wieldtype = 1; } if (wieldorig == 10) { if (wieldie == 1) wieldtype = 8; else wieldtype = 2; } if (wieldorig == 9) { if (wieldie == 1) wieldtype = 8; else wieldtype = 1; } if (wieldorig == 8) wieldtype = 8; if (wieldorig == 7) { if (wieldie == 1) wieldtype = 4; else if (wieldie == 2) wieldtype = 2; else wieldtype = 1; } if (wieldorig == 6) { if (wieldie == 1 || wieldie == 2) wieldtype = 2; else wieldtype = 4; } if (wieldorig == 5) { if (wieldie == 1) wieldtype = 4; else wieldtype = 1; } if (wieldorig == 4) wieldtype = 4; if (wieldorig == 3) { if (wieldie == 2 || wieldie == 4) wieldtype = 2; else wieldtype = 1; } if (wieldorig == 2) wieldtype = 2; if (wieldorig == 1) wieldtype = 1; if (wieldtype == 8) wield = wield4; else if (wieldtype == 4) wield = wield3; else if (wieldtype == 2) wield = wield2; else wield = wield1; if (ch->stance[0] > 0 && number_percent () == 1) { int stance = ch->stance[0]; if (ch->stance[stance] >= 200) { special_move (ch, victim); return; } } if (IS_CREATOR (ch) || IS_CLASS (ch, CLASS_MONK)) { if (!IS_NPC (ch)) { unarmed = number_range (1, 7); if (!IS_NPC (ch) && ch->cmbt[unarmed] != 0) { fightaction (ch, victim, ch->cmbt[unarmed], dt, wieldtype); } } } unarmed = 0; one_hit (ch, victim, dt, wieldtype); if (victim == NULL || victim->position != POS_FIGHTING) return; // Check for Highlander empowerment - Krynn if (IS_CLASS (ch, CLASS_HIGHLANDER) && (ch->hempower > 0)) { int mult = 1; int x; if ((ch->quickening[1] >= 25) && (number_range (1, 100) > 10)) mult++; if ((ch->quickening[1] >= 50) && (number_range (1, 100) > 30)) mult++; if ((ch->quickening[1] >= 75) && (number_range (1, 100) > 60)) mult++; if ((ch->quickening[1] >= 100) && (number_range (1, 100) > 90)) mult++; if (IS_DEMPOWER (ch, HPOWER_USE_BYPASS) && (mult > 1)) mult += 1; if (IS_DEMPOWER (ch, HPOWER_USE_SHIELDLESS) && (mult > 1)) mult += 1; for (x = 0; x == mult; x++) one_hit (ch, victim, dt, wieldtype); } if (dt == TYPE_UNDEFINED) { dt = TYPE_HIT; if (wield != NULL && wield->item_type == ITEM_WEAPON) { dt += wield->value[3]; if (wield->value[0] >= 1) { if (wield->value[0] >= 1000) sn = wield->value[0] - ((wield->value[0] / 1000) * 1000); else sn = wield->value[0]; if (sn != 0 && victim->position == POS_FIGHTING) (*skill_table[sn].spell_fun) (sn, wield->level, ch, victim); } } } if (victim == NULL || victim->position != POS_FIGHTING) return; if (ch->fighting != victim || dt == gsn_backstab || dt == gsn_headbutt || dt == gsn_bodyspikes) return; if (!IS_NPC (victim) && !IS_SET (victim->special, SPC_WOLFMAN) && number_percent () <= victim->pcdata->learned[gsn_fastdraw]) { OBJ_DATA *obj; int wpntype = 0; int wpntype2 = 0; if ((obj = get_eq_char (victim, WEAR_SCABBARD_R)) != NULL) { wpntype = obj->value[3]; if (wpntype < 0 || wpntype > 12) wpntype = 0; if ((obj = get_eq_char (victim, WEAR_WIELD)) != NULL) { obj_from_char (obj); obj_to_char (obj, victim); // obj_to_room (obj, victim->in_room); act ("You hurl $p aside.", victim, obj, NULL, TO_CHAR); act ("$n hurls $p aside.", victim, obj, NULL, TO_ROOM); } do_draw (victim, "right"); } if ((obj = get_eq_char (victim, WEAR_SCABBARD_L)) != NULL) { wpntype2 = obj->value[3]; if (wpntype2 < 0 || wpntype2 > 12) wpntype2 = 0; if ((obj = get_eq_char (victim, WEAR_HOLD)) != NULL) { obj_from_char (obj); obj_to_char (obj, victim); act ("You hurl $p aside.", victim, obj, NULL, TO_CHAR); act ("$n hurls $p aside.", victim, obj, NULL, TO_ROOM); } do_draw (victim, "left"); } if (wpntype > 0) one_hit (victim, ch, TYPE_UNDEFINED, 1); if (victim == NULL || victim->position != POS_FIGHTING) return; if (wpntype2 > 0) one_hit (victim, ch, TYPE_UNDEFINED, 2); if (victim == NULL || victim->position != POS_FIGHTING) return; } maxcount = number_attacks (ch, victim); if (maxcount == 0) return; if (!IS_NPC (ch)) { chance = 0; if (wield != NULL && wield->item_type == ITEM_WEAPON) { int tempnum = wield->value[3]; chance = (ch->wpn[tempnum]) * 0.5; } else chance = (ch->wpn[0]) * 0.5; if (number_percent () <= chance) maxcount += 1; } if (IS_CLASS (ch, CLASS_FAE) && IS_EXTRA2 (ch, EXTRA2_FAESPEED)) maxcount += 3; if (wieldorig == 3) maxcount += 1; for (countup = 0; countup <= maxcount; countup++) { wieldtype = wieldorig; if (wieldorig == 3) { if (number_range (1, 2) == 2) wieldtype = 2; else wieldtype = 1; } one_hit (ch, victim, -1, wieldtype); if (victim == NULL || victim->position != POS_FIGHTING) return; if (ch->fighting != victim) return; } if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_VAMPIRE) && IS_VAMPAFF (ch, VAM_FANGS) && number_range (1, 2) == 1) vam_bite (ch, victim, (TYPE_HIT + 10), 0); if (!IS_NPC (ch) && !IS_CLASS (ch, CLASS_VAMPIRE) && IS_VAMPAFF (ch, VAM_FANGS)) one_hit (ch, victim, (TYPE_HIT + 10), 0); if (victim == NULL || victim->position != POS_FIGHTING) return; if (!IS_NPC (ch)) { if (IS_CLASS (ch, CLASS_DROW) && IS_POLYAFF (ch, POLY_ZULO)) { act ("You spit webbing at $N.", ch, NULL, victim, TO_CHAR); act ("$n spits webbing at $N.", ch, NULL, victim, TO_NOTVICT); act ("$n spits webbing at you.", ch, NULL, victim, TO_VICT); if (number_range (1, 10) == 10 && !IS_SET (victim->affected_by, AFF_WEBBED)) { act ("$N is coated in a sticky webbing.", ch, NULL, victim, TO_CHAR); act ("$N is coated in a sticky webbing.", ch, NULL, victim, TO_NOTVICT); act ("You are coated in a sticky webbing.", ch, NULL, victim, TO_VICT); SET_BIT (victim->affected_by, AFF_WEBBED); } } if ( IS_CLASS( ch, CLASS_DROW ) && ( IS_SET( ch->extra2, DROW_DARKTENDRILS ) ) ) { multi_hit (ch, victim, gsn_darktendrils); } if (IS_CLASS (ch, CLASS_DROW) && IS_SET (ch->pcdata->powers[1], DPOWER_ARMS)) { int ii; if (IS_POLYAFF (ch, POLY_SPIDERFORM)) { for (ii = 0; ii < 8; ii++) { if (number_range (1, 4) == 1) { one_hit (ch, victim, gsn_spiderform, 0); } } } else { for (ii = 0; ii < 4; ii++) { if (number_range (1, 3) == 1) { one_hit (ch, victim, gsn_spiderform, 0); } } } } if ( IS_CLASS(ch, CLASS_WRAITH) && ( ch->arcanoi[WPAND] == 5 ) && number_range(1,2) == 1 ) one_hit( ch, victim, gsn_phenom, 0 ); if ( IS_CLASS(ch, CLASS_WRAITH) && ( ch->arcanoi[WMATE] >= 3 ) && number_range(1,2) == 1 ) one_hit(ch, victim, gsn_buffet, 0); if ((IS_CLASS (ch, CLASS_WEREWOLF) && ch->gifts[BLACKFURIES] > 2) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_waspt, 0); if (IS_CLASS (ch, CLASS_DEMON) && IS_SET (ch->warp, WARP_SPIKETAIL) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_spiket, 0); if (IS_CLASS (ch, CLASS_DEMON) && IS_SET (ch->warp, WARP_SHARDS) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_shards, 0); if (IS_CLASS (ch, CLASS_DEMON) && IS_SET (ch->warp, WARP_MAGMA) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_magma, 0); if (IS_CLASS (ch, CLASS_DEMON) && IS_SET (ch->warp, WARP_VENOMTONG) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_venomt, 0); if (IS_DEMAFF (ch, DEM_HORNS) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_headbutt, 0); if (IS_VAMPAFF (ch, VAM_HORNS) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_headbutt, 0); if (IS_CLASS (ch, CLASS_DEMON) && IS_DEMAFF (ch, DEM_BODYSPIKES) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_bodyspikes, 0); if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_NINGENNO] > 3 && number_range (1, 3) == 1) one_hit (ch, victim, gsn_shiroken, 0); if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_TENGU] > 1 && number_range (1, 2) == 1) one_hit (ch, victim, gsn_dart_shiroken, 0); else if (IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_TENGU] > 2 && number_range (1, 2) == 1) { one_hit (ch, victim, gsn_dart_shiroken, 0); one_hit (ch, victim, gsn_dart_shiroken, 0); } if (IS_CLASS (ch, CLASS_DEMON) && IS_DEMAFF (ch, DEM_TAIL) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_tail, 0); if (IS_SET (ch->newbits, NEW_QUILLS)) one_hit (ch, victim, gsn_quills, 0); if (IS_CLASS (ch, CLASS_DEMON) && IS_SET (ch->warp, WARP_WINGS) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_buffet, 0); if (IS_CLASS (ch, CLASS_VAMPIRE) && IS_VAMPAFF (ch, VAM_WINGS) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_buffet, 0); if (IS_CLASS (ch, CLASS_VAMPIRE) && IS_VAMPAFF (ch, VAM_TAIL) && number_range (1, 3) == 1) one_hit (ch, victim, gsn_tail, 0); if (IS_CLASS (ch, CLASS_DRAGON) && IS_SET (ch->pcdata->dragonaff, DRA_TAIL)) one_hit (ch, victim, gsn_sweep, 0); if (IS_CLASS (ch, CLASS_DRAGON) && IS_SET (ch->pcdata->dragonaff, DRA_WINGS)) one_hit (ch, victim, gsn_buffet, 0); if (IS_CLASS (ch, CLASS_DRAGON) && IS_SET (ch->pcdata->dragonaff, DRA_FANGS) && (number_range (1, 3) == 1 || IS_SET (ch->pcdata->dragonaff, DRA_LUCK))) one_hit (ch, victim, gsn_fangs, 0); } if (victim == NULL || victim->position != POS_FIGHTING) return; /* if (!IS_NPC(ch)) { int x; int acid = 0; for( x = 0; x < 5 && ch->pcdata->breath[x] != NULL ; x++) { if (IS_CLASS(ch, CLASS_DRAGON) && !str_cmp(ch->pcdata->breath[x], "frost") && ( (number_range(1,3) == 1) || IS_SET(ch->pcdata->dragonaff, DRA_LUCK))) spell_frost_breath(skill_lookup( "frost breath" ),GET_AGE(ch) * 10, ch, victim); if (IS_CLASS(ch, CLASS_DRAGON) && !str_cmp(ch->pcdata->breath[x], "fire") && ( (number_range(1,3) == 1) || IS_SET(ch->pcdata->dragonaff, DRA_LUCK))) spell_fire_breath(skill_lookup( "fire breath" ),GET_AGE(ch) * 10, ch, victim); if (IS_CLASS(ch, CLASS_DRAGON) && !str_cmp(ch->pcdata->breath[x], "lightning") && ( (number_range(1,3) == 1) || IS_SET(ch->pcdata->dragonaff, DRA_LUCK))) spell_lightning_breath(skill_lookup( "lightning breath" ),GET_AGE(ch) * 10, ch, victim ); if (IS_CLASS(ch, CLASS_DRAGON) && !str_cmp(ch->pcdata->breath[x], "acid") && acid < 3 && ( (number_range(1,3) == 1) || IS_SET(ch->pcdata->dragonaff, DRA_LUCK))) { spell_acid_breath(skill_lookup( "acid breath" ),GET_AGE(ch) * 10, ch, victim ); acid += 1; } if (IS_CLASS(ch, CLASS_DRAGON) && !str_cmp(ch->pcdata->breath[x], "gas") && ( (number_range(1,3) == 1) || IS_SET(ch->pcdata->dragonaff, DRA_LUCK))) spell_gas_breath(skill_lookup( "gas breath" ),GET_AGE(ch) * 10, ch, victim ); } } */ if (IS_CLASS (ch, CLASS_DRAGON) && !IS_NPC (ch)) { if (ch->in_room == NULL) return; if (victim->in_room == NULL) return; /*Breath 1 */ if (ch->pcdata->breath[0] == NULL) return; breathindex = (number_range (1, 50)); if (IS_SET (ch->pcdata->dragonaff, DRA_LUCK)) breathindex += 10; if (!str_cmp (ch->pcdata->breath[0], "frost") && (breathindex >= 40)) spell_frost_breath (skill_lookup ("frost breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[0], "fire") && (breathindex >= 40)) spell_fire_breath (skill_lookup ("fire breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[0], "lightning") && (breathindex >= 40)) spell_lightning_breath (skill_lookup ("lightning breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[0], "acid") && (breathindex >= 45)) spell_acid_breath (skill_lookup ("acid breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[0], "gas") && (breathindex >= 35)) spell_gas_breath (skill_lookup ("gas breath"), GET_AGE(ch) * 5, ch, victim); /*Breath 2*/ if (ch->pcdata->breath[1] == NULL) return; breathindex = (number_range (1, 50)); if (IS_SET (ch->pcdata->dragonaff, DRA_LUCK)) breathindex += 10; if (!str_cmp (ch->pcdata->breath[1], "frost") && (breathindex >= 40)) spell_frost_breath (skill_lookup ("frost breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[1], "fire") && (breathindex >= 40)) spell_fire_breath (skill_lookup ("fire breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[1], "lightning") && (breathindex >= 40)) spell_lightning_breath (skill_lookup ("lightning breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[1], "acid") && (breathindex >= 45)) spell_acid_breath (skill_lookup ("acid breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[1], "gas") && (breathindex >= 35)) spell_gas_breath (skill_lookup ("gas breath"), GET_AGE(ch) * 5, ch, victim); /*Breath 3 */ if (ch->pcdata->breath[2] == NULL) return; breathindex = (number_range (1, 50)); if (IS_SET (ch->pcdata->dragonaff, DRA_LUCK)) breathindex += 10; if (!str_cmp (ch->pcdata->breath[2], "frost") && (breathindex >= 40)) spell_frost_breath (skill_lookup ("frost breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[2], "fire") && (breathindex >= 40)) spell_fire_breath (skill_lookup ("fire breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[2], "lightning") && (breathindex >= 40)) spell_lightning_breath (skill_lookup ("lightning breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[2], "acid") && (breathindex >= 45)) spell_acid_breath (skill_lookup ("acid breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[2], "gas") && (breathindex >= 35)) spell_gas_breath (skill_lookup ("gas breath"), GET_AGE(ch) * 5, ch, victim); /* Breath 4*/ if (ch->pcdata->breath[3] == NULL) return; breathindex = (number_range (1, 50)); if (IS_SET (ch->pcdata->dragonaff, DRA_LUCK)) breathindex += 10; if (!str_cmp (ch->pcdata->breath[3], "frost") && (breathindex >= 40)) spell_frost_breath (skill_lookup ("frost breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[3], "fire") && (breathindex >= 40)) spell_fire_breath (skill_lookup ("fire breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[3], "lightning") && (breathindex >= 40)) spell_lightning_breath (skill_lookup ("lightning breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[3], "acid") && (breathindex >= 45)) spell_acid_breath (skill_lookup ("acid breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[3], "gas") && (breathindex >= 35)) spell_gas_breath (skill_lookup ("gas breath"), GET_AGE(ch) * 5, ch, victim); /*Breath 5 */ if (ch->pcdata->breath[4] == NULL) return; breathindex = (number_range (1, 50)); if (IS_SET (ch->pcdata->dragonaff, DRA_LUCK)) breathindex += 10; if (!str_cmp (ch->pcdata->breath[4], "frost") && (breathindex >= 40)) spell_frost_breath (skill_lookup ("frost breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[4], "fire") && (breathindex >= 40)) spell_fire_breath (skill_lookup ("fire breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[4], "lightning") && (breathindex >= 40)) spell_lightning_breath (skill_lookup ("lightning breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[4], "acid") && (breathindex >= 45)) spell_acid_breath (skill_lookup ("acid breath"), GET_AGE(ch) * 5, ch, victim); if (!str_cmp (ch->pcdata->breath[4], "gas") && (breathindex >= 35)) spell_gas_breath (skill_lookup ("gas breath"), GET_AGE(ch) * 5, ch, victim); } if (victim == NULL || victim->position != POS_FIGHTING) return; if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_VAMPIRE) && IS_VAMPAFF (ch, VAM_SERPENTIS)) spell_poison (gsn_poison, (ch->level * number_range (5, 10)), ch, victim); else if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_WEREWOLF) && ch->pcdata->powers[WPOWER_SPIDER] > 0) spell_poison (gsn_poison, (ch->level * number_range (5, 10)), ch, victim); else if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_NINGENNO] > 4) spell_poison (gsn_poison, (ch->level * number_range (5, 10)), ch, victim); if (victim->itemaffect < 1) return; if (IS_NPC (victim) || victim->spl[1] < 4) level = victim->level; else level = (victim->spl[1] * 0.25); if (IS_SET (victim->newbits, NEW_MONKFLAME) && !IS_AFFECTED (ch, AFF_FLAMING) && !WORN_ARTIFACT (ch, ARTI_DEMONS_HEART)) { if (number_percent () > 65) { SET_BIT (ch->affected_by, AFF_FLAMING); if (!IS_NPC(victim) && !IS_VAMPAFF (victim, VAM_CLAWS)) { act ("Your flaming hands catch $n on fire!", ch, NULL, victim, TO_VICT); act ("$N's flaming hands catch $n on fire!", ch, NULL, victim, TO_NOTVICT); act ("$N's flaming hands catch you on fire!.", ch, NULL, victim, TO_CHAR); } else { act ("Your flaming claws catch $n on fire!", ch, NULL, victim, TO_VICT); act ("$N's flaming claws catch $n on fire!", ch, NULL, victim, TO_NOTVICT); act ("$N's flaming claws catch you on fire!.", ch, NULL, victim, TO_CHAR); } } else { return; } } if (IS_ITEMAFF (victim, ITEMA_SHOCKSHIELD) && ch->position == POS_FIGHTING) if ((sn = skill_lookup ("lightning bolt")) > 0) (*skill_table[sn].spell_fun) (sn, level, victim, ch); if (IS_ITEMAFF (victim, ITEMA_FIRESHIELD) && ch->position == POS_FIGHTING) if ((sn = skill_lookup ("fireball")) > 0) (*skill_table[sn].spell_fun) (sn, level, victim, ch); if (IS_ITEMAFF (victim, ITEMA_ICESHIELD) && ch->position == POS_FIGHTING) if ((sn = skill_lookup ("chill touch")) > 0) (*skill_table[sn].spell_fun) (sn, level, victim, ch); if (IS_ITEMAFF (victim, ITEMA_ACIDSHIELD) && ch->position == POS_FIGHTING) if ((sn = skill_lookup ("acid blast")) > 0) (*skill_table[sn].spell_fun) (sn, level, victim, ch); if (IS_ITEMAFF (victim, ITEMA_CHAOSSHIELD) && ch->position == POS_FIGHTING) if ((sn = skill_lookup ("chaos blast")) > 0) (*skill_table[sn].spell_fun) (sn, level, victim, ch); return; } int number_attacks( CHAR_DATA *ch, CHAR_DATA *victim ) { int percentage = 100; if ( IS_NPC( ch ) ) { if ( ch->level >= 50 ) percentage += 100; if ( ch->level >= 100 ) percentage += 100; if ( ch->level >= 500 ) percentage += 100; if ( ch->level >= 1000 ) percentage += 100; if ( ch->level >= 1500 ) percentage += 100; if ( ch->level >= 2000 ) percentage += 200; if ( IS_NPC( victim ) ) percentage += 200; #ifdef FUCK_PLAYERS percentage += 5000; #endif return percentage / 100; } percentage += 250; if ( !IS_NPC( victim ) ) { percentage += ( ch->lstatus * 75 ); percentage -= ( victim->lstatus * 35 ); if ( ch->lstatus > victim->lstatus ) percentage += 75; else if ( ch->lstatus < victim->lstatus ) percentage -= 75; } else percentage += ( ch->lstatus * 125 ); if ( ch->move > 50000 ) percentage += ( ch->move - 50000 ) / 100; if ( !IS_STANCE( ch, STANCE_MONKEY ) ) { if ( IS_STANCE( ch, STANCE_VIPER ) ) percentage += 100; else if ( IS_STANCE( ch, STANCE_MANTIS ) ) percentage += 200; else if ( IS_STANCE( ch, STANCE_TIGER ) ) percentage += 300; } if ( IS_ITEMAFF( ch, ITEMA_SPEED ) ) { if ( ( ( ch->move / ch->max_move ) * 100 ) > 50 ) percentage += 150; else percentage += 75; } if ( IS_SUPER_NPC( ch ) ) { percentage += 100; if ( number_range( 0, 4 ) == 0 ) percentage += 200; } if ( IS_CLASS( ch, CLASS_HIGHLANDER ) ) { if ( IS_DEMPOWER( ch, HPOWER_SPEED ) ) percentage += 125; if ( IS_ITEMAFF( ch, ITEMA_SPEED ) ) percentage += number_range( 25, 75 ); percentage = ( percentage * 3 ) / 5; } else if ( IS_CLASS( ch, CLASS_DROW ) ) { if ( IS_SET( ch->special, SPC_DROW_WAR ) ) percentage += 100; else if ( IS_SET( ch->special, SPC_DROW_ASN) ) percentage += 25; else percentage -= 25; if ( ch->pcdata->stats[UNI_GEN] < 3 ) percentage += 40; if ( IS_SET( ch->pcdata->powers[1], DPOWER_SPEED ) ) percentage += 85; } else if ( IS_CLASS( ch, CLASS_FAE ) ) { if ( IS_SET( ch->extra2, EXTRA2_FAESPEED ) ) percentage += 125; percentage *= 1.1; } else if ( IS_CLASS( ch, CLASS_DRAGON ) ) { percentage += 15 + ( 10 * GET_AGE( ch ) ); } else if ( IS_CLASS( ch, CLASS_WRAITH ) ) { percentage += 150 + ( percentage / 100 ); } else if ( IS_CLASS( ch, CLASS_MAGE ) ) { percentage += ( ch->max_mana / 175 ); percentage *= 1.15; } else if ( IS_CLASS( ch, CLASS_NINJA ) ) { if ( ch->pcdata->powers[NPOWER_CHIKYU] >= 3 ) percentage += 250; } else if ( IS_CLASS( ch, CLASS_VAMPIRE ) ) { percentage += 100 * ( get_disc( ch, VAM_CELE ) / 2 ); } else if ( IS_CLASS( ch, CLASS_WEREWOLF ) ) { percentage += 40 * ch->gifts[SILENTSTRIDERS]; } else if ( IS_CLASS( ch, CLASS_DEMON ) ) { if ( IS_DEMPOWER( ch, DEM_SPEED ) ) percentage += 100; if ( IS_SET( ch->warp, WARP_QUICKNESS ) ) percentage += 100; } else if ( IS_CLASS( ch, CLASS_MONK ) ) { percentage += 35 * ( ch->monkab[COMBAT] + 1 ); } else percentage += 100; if ( !IS_CLASS( ch, CLASS_HIGHLANDER ) ) { percentage = ( percentage / 3 ) * 2.2; if ( IS_CLASS( ch, CLASS_WEREWOLF ) ) percentage *= 0.85; } if ( IS_CLASS( ch, CLASS_MAGE ) ) percentage *= 0.87; return percentage / 100; } /* * Hit one guy once. */ void one_hit (CHAR_DATA * ch, CHAR_DATA * victim, int dt, int handtype) { OBJ_DATA *wield; OBJ_DATA *gloves; int victim_ac; int thac0; int thac0_00; int thac0_32; int dam; int diceroll; int wdam; int level; int bufz; bool dual_wield = FALSE; bool right_hand; char buf[MSL]; /* * Can't beat a dead char! * Guard against weird room-leavings. */ if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return; if (!IS_NPC (ch) && IS_ITEMAFF (ch, ITEMA_PEACE)) { send_to_char ("You are unable to attack them.\n\r", ch); return; } if (!IS_NPC (victim) && IS_ITEMAFF (victim, ITEMA_PEACE)) { send_to_char ("You can't seem to attack them.\n\r", ch); return; } if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return; } if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_STEELSHIELD)) { send_to_char ("You cannot attack while in Majesty.\n\r", ch); return; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_STEELSHIELD)) { send_to_char ("There are far to imposing.\n\r", ch); return; } /* * Figure out the type of damage message. */ /* if (handtype == 8) { wield = get_eq_char (ch, WEAR_FOURTH); right_hand = FALSE; } else if (handtype == 4) { wield = get_eq_char (ch, WEAR_THIRD); right_hand = FALSE; } else if (handtype == 2) { wield = get_eq_char (ch, WEAR_HOLD); right_hand = FALSE; } else { if (!IS_NPC (ch) && (wield = get_eq_char (ch, WEAR_DUAL)) != NULL); else if (!IS_NPC (ch) && IS_SET (ch->extra2, PLR_RIGHTHAND)) wield = get_eq_char (ch, WEAR_WIELD); else if (!IS_NPC (ch) && IS_SET (ch->act, PLR_LEFTHAND)) wield = get_eq_char (ch, WEAR_HOLD); else { if (number_range (1, 10) > 4 && !IS_NPC (ch)) wield = get_eq_char (ch, WEAR_HOLD); else wield = get_eq_char (ch, WEAR_WIELD); } right_hand = 1; // improve the right hand anyway... } */ /* * Figure out the type of damage message. */ if (handtype == 2) { wield = get_eq_char( ch, WEAR_HOLD ); right_hand = FALSE; } else { wield = get_eq_char( ch, WEAR_WIELD ); right_hand = TRUE; } if (wield == NULL) { wield = get_eq_char( ch, WEAR_DUAL); right_hand = TRUE; if ((wield != NULL) && (wield->item_type == ITEM_WEAPON)) dual_wield = TRUE; } if (dt == TYPE_UNDEFINED) { dt = TYPE_HIT; if (wield != NULL && wield->item_type == ITEM_WEAPON) dt += wield->value[3]; } if (ch->wpn[dt - 1000] > 5) level = (ch->wpn[dt - 1000] / 5); else level = 1; if (level > 40) level = 40; /* * Calculate to-hit-armor-class-0 versus armor. */ if (IS_NPC (ch)) { thac0_00 = 20; thac0_32 = 0; } else { thac0_00 = SKILL_THAC0_00; thac0_32 = SKILL_THAC0_32; } thac0 = 0 - interpolate (level, thac0_00, thac0_32) - (char_hitroll (ch) / 10); victim_ac = UMIN (10, char_ac (victim) / 50); if (!can_see (ch, victim)) victim_ac -= 100; if (IS_CLASS (ch, CLASS_DRAGON) && IS_SET (ch->pcdata->dragonaff, DRA_TERROR) && IS_NPC (victim)) /*dragons */ { /*dragons */ victim_ac += 200; /*dragons */ } /*dragons */ /* * The moment of excitement! */ while ((diceroll = number_bits (5)) >= 20) ; #ifdef FUCK_PLAYERS while (diceroll == 0 || (diceroll != 19 && diceroll < thac0 - victim_ac)) { while ((diceroll = number_bits (5)) >= 20); } #endif if (diceroll == 0 || (diceroll != 19 && diceroll < thac0 - victim_ac)) { /* Miss. */ damage (ch, victim, 0, dt); tail_chain (); if (!is_safe (ch, victim)) { improve_wpn (ch, dt, right_hand); improve_stance (ch); } return; } /* * Hit. * Calc damage. */ if (IS_NPC (ch)) { dam = number_range (ch->level, ch->level * 3 / 2); if (wield != NULL) dam += dam * 0.5; #ifdef FUCK_PLAYERS dam = dice (1, 30) * 1000; #endif } else { if (IS_SET(ch->more, MORE_LIONSMANE)) dam = number_range (500, 750); else if (IS_CLASS (ch, CLASS_DRAGON) && (wield == NULL || wield->item_type != ITEM_WEAPON)) dam = number_range (500, 750); else if (IS_CLASS (ch, CLASS_WEREWOLF) && (wield == NULL || wield->item_type != ITEM_WEAPON)) dam = number_range (400, 650); else if (IS_SET (ch->newbits, NEW_MONKADAM) && (wield == NULL || wield->item_type != ITEM_WEAPON)) dam = dice (434, 666); else if (IS_VAMPAFF (ch, VAM_CLAWS) && (wield == NULL || wield->item_type != ITEM_WEAPON)) dam = number_range (200, 400); else if (wield != NULL && wield->item_type == ITEM_WEAPON) dam = number_range (wield->value[1], wield->value[2]); else dam = number_range (1, 4); } if (number_range (1, 5) == 2) { if (ch->fighting == victim && IS_CLASS (ch, CLASS_MONK) && !IS_NPC (ch) && ch->monkab[BODY] > 3) { wdam = number_range ((ch->chi[CURRENT] * 6), (ch->chi[CURRENT] * 10)); if (victim->alignment < 0) wdam *= 1.5; act ("$n's hands glow with a heavenly aura.", ch, NULL, victim, TO_VICT); act ("$n's aura sears your flesh!", ch, NULL, victim, TO_VICT); act ("Your heavenly aura sears $N's flesh.", ch, NULL, victim, TO_CHAR); act ("$n's hands' heavenly aura sears $N's flesh.", ch, NULL, victim, TO_ROOM); victim->hit -= wdam; update_pos (victim); } } /* Fun with weapons */ if (!IS_NPC (ch) && wield != NULL) { if (number_range (1, 5) == 2) { if (ch->fighting == victim) { if (IS_WEAP (wield, WEAPON_FLAMING) && !WORN_ARTIFACT (victim, ARTI_DEMONS_HEART)) { wdam = number_range (1, wield->level / 4 + 1); if (!IS_SET (ch->more, MORE_SHIELDS)) { act ("$n is burned by $p.", victim, wield, NULL, TO_ROOM); act ("$p sears your flesh.", victim, wield, NULL, TO_CHAR); } hurt_person (ch, victim, wdam); update_pos (victim); } if (IS_WEAP (wield, WEAPON_FROST)) { wdam = number_range (1, wield->level / 6 + 2); if (!IS_SET (ch->more, MORE_SHIELDS)) { act ("$p freezes $n.", victim, wield, NULL, TO_ROOM); act ("The cold touch of $p surrounds you with ice.", victim, wield, NULL, TO_CHAR); } hurt_person (ch, victim, wdam); update_pos (victim); } if (IS_WEAP (wield, WEAPON_POISON)) { wdam = number_range (1, wield->level / 6 + 2); if (!IS_SET (ch->more, MORE_SHIELDS)) { act ("$n turns green as $p poisons $m.", victim, wield, NULL, TO_ROOM); act ("You feel sick as $p's poisoned edge pierces you.", victim, wield, NULL, TO_CHAR); } hurt_person (ch, victim, wdam); update_pos (victim); } } } } dam += char_damroll (ch); dam = add_bonuses (ch, victim, dam, dt); /* Werewolf Silver Stuff.. */ if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_WEREWOLF)) { if (number_percent () > victim->pcdata->powers[WPOWER_SILVER]) { if (is_garou (ch)) { if (IS_GAR1 (ch, GAROU_AVENGER)) dam *= 3; else if (ch->gifts[AHROUN] >= 4 || ch->gifts[SILVERFANGS] >= 2) dam *= 2.2; else if (wield != NULL && IS_SET (wield->spectype, SITEM_SILVER)) dam *= 2; else if ((gloves = get_eq_char (ch, WEAR_HANDS)) != NULL && IS_SET (gloves->spectype, SITEM_SILVER)) dam *= 2; } else if (!is_garou (ch)) { if (wield != NULL && IS_SET (wield->spectype, SITEM_SILVER)) dam *= 2; else if ((gloves = get_eq_char (ch, WEAR_HANDS)) != NULL && IS_SET (gloves->spectype, SITEM_SILVER)) dam *= 2; } } } if (dt == gsn_backstab) { if (IS_CLASS (ch, CLASS_DROW)) dam *= number_range (4, 5); else dam *= number_range (2, 3); if (IS_CLASS (ch, CLASS_NINJA) && !IS_NPC (ch) && ch->pcdata->powers[NPOWER_NINGENNO] >= 2) dam *= number_range (4, 8); else dam *= number_range (2, 4); } if (dt == gsn_garotte) dam *= (number_range (3, 5)); if (dt == gsn_circle) dam *= number_range (5, 6); if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_HIGHLANDER) && IS_DEMPOWER (victim, HPOWER_TOUGHNESS)) { char buf[MAX_STRING_LENGTH]; int skin; int rebound; skin = number_range (1, 100); rebound = number_range (1, 100); if (skin == 20 || skin == 40 || skin == 60 || skin == 80 || skin == 100) { stc ("#3You bounce their pathetic blow off your skin#n.\n\r", victim); stc ("#3Your opponent bounces your attack off their skin#n.\n\r", ch); if (rebound == 10 || rebound == 50 || rebound == 100) { sprintf (buf, "#3The bounced blow slams into them#n. [#1%d#n]\n\r", dam / 2); stc (buf, victim); sprintf (buf, "#3Your attack bounces and slams into you#n. [#1%d#n]\n\r", dam / 2); stc (buf, ch); dam /= 2; damage (victim, ch, dam, dt); } dam = 0; } } if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_DROW) && IS_SET (victim->extra2, DROW_DARKTENDRILS)) { int ddodge = number_range (1, 50); if (ddodge == 10 || ddodge == 20 || ddodge == 30 || ddodge == 40 || ddodge == 50) { bufz = number_range(1,20); sprintf (buf,"#0You dark aura absorbs the damage and channels some of it into you. #r[#G+#C%d#r]#n.\n\r", bufz); stc(buf,victim); stc ("#0Your opponent's dark aura absorbs your damage#n.\n\r", ch); victim->hit += bufz; dam = 0; } } damage (ch, victim, dam, dt); // special arti's -- Serenity if ((victim != NULL) && (ch->fighting == victim) && (dam > 0) && (wield != NULL) && ((dt - TYPE_HIT >= 0) && (dt - TYPE_HIT <= 12))) { bool arti = FALSE; char movie_buf1[10000]; char movie_buf2[10000]; char movie_buf3[10000]; int activate = 0; OBJ_DATA *the_arti; if (dam > ch->damcap[DAM_CAP]) dam = ch->damcap[DAM_CAP]; if ((wield != NULL) && OBJ_ARTIFACT (wield)) arti = TRUE; if ((!arti) && (WORN_ARTIFACT (ch, ARTI_PLATE_IRON_GAUNTLET))) arti = TRUE; if ((!arti) && (WORN_ARTIFACT (ch, ARTI_CROWN_OF_CHRYSTANCIA))) arti = TRUE; if ((arti) && (IS_ARTIFACT (wield, ARTI_SHATTERED_BLADE))) { if ((the_arti = get_artifact (ch, ARTI_SHATTERED_BLADE)) == NULL) { bug ("Supposedly had Shattered Blade, but couldn't find it.", 0); tail_chain (); if (!is_safe (ch, victim)) { improve_wpn (ch, dt, right_hand); improve_stance (ch); } return; } activate = the_arti->points; if (activate > 0) { sprintf (movie_buf1, "Slivers of $p tear off and dig into $N's wound causing more damage. #w[ #r%d #w]#n", (dam / 4)); sprintf (movie_buf2, "Slivers from $n's $p tear off and dig into your wound causing more damage. #w[ #r%d #w]#n", (dam / 4)); sprintf (movie_buf3, "$n's motion causes slivers of $p to tear off and dig into the wound causing more damage to $N."); act (movie_buf1, ch, wield, victim, TO_CHAR); act (movie_buf2, ch, wield, victim, TO_VICT); act (movie_buf3, ch, wield, victim, TO_NOTVICT); hurt_person (ch, victim, (dam / 4)); the_arti->points = 0; } else the_arti->points++; } if ((arti) && (IS_ARTIFACT (wield, ARTI_METEORIC_AXE))) { if ((the_arti = get_artifact (ch, ARTI_METEORIC_AXE)) == NULL) { bug ("Supposedly had Axe of Meteoric Steel, but couldn't find it.", 0); tail_chain (); if (!is_safe (ch, victim)) { improve_wpn (ch, dt, right_hand); improve_stance (ch); } return; } activate = the_arti->points; if (activate > 1) { sprintf (movie_buf1, "Small meteors fly forth from $p striking $N. #w[ #r%d #w]#n", (dam / 10)); sprintf (movie_buf2, "Small meteors fly forth from $n's $p striking you. #w[ #r%d #w]#n", (dam / 10)); sprintf (movie_buf3, "Small meteors fly forth from $n's $p striking $N."); act (movie_buf1, ch, wield, victim, TO_CHAR); act (movie_buf2, ch, wield, victim, TO_VICT); act (movie_buf3, ch, wield, victim, TO_NOTVICT); hurt_person (ch, victim, (dam / 10)); the_arti->points = 0; } else the_arti->points++; } if ((arti) && (WORN_ARTIFACT (ch, ARTI_PLATE_IRON_GAUNTLET))) { OBJ_DATA *wield_obj; if ((the_arti = get_artifact (ch, ARTI_PLATE_IRON_GAUNTLET)) == NULL) { bug ("Supposedly had Plate Iron Gauntlet, but couldn't find it.", 0); tail_chain (); if (!is_safe (ch, victim)) { improve_wpn (ch, dt, right_hand); improve_stance (ch); } return; } activate = the_arti->points; if (activate > 1) { wield_obj = create_object (get_obj_index (ARTI_PLATE_IRON_GAUNTLET), 0); sprintf (movie_buf1, "You strike $N hard with your Gauntlets. #w[ #r%d #w]#n", (dam / 10)); sprintf (movie_buf2, "$n strikes you hard with $s Gauntlets. #w[ #r%d #w]#n", (dam / 10)); sprintf (movie_buf3, "$n strikes $N hard with $s Gauntlets."); act (movie_buf1, ch, NULL, victim, TO_CHAR); act (movie_buf2, ch, NULL, victim, TO_VICT); act (movie_buf3, ch, NULL, victim, TO_NOTVICT); hurt_person (ch, victim, (dam / 10)); extract_obj (wield_obj); the_arti->points = 0; } else the_arti->points++; } if ((arti) && (WORN_ARTIFACT (ch, ARTI_CROWN_OF_CHRYSTANCIA))) { OBJ_DATA *wield_obj; if ((the_arti = get_artifact (ch, ARTI_CROWN_OF_CHRYSTANCIA)) == NULL) { bug ("Supposedly had Crown of Chrystancia, but couldn't find it.", 0); tail_chain (); if (!is_safe (ch, victim)) { improve_wpn (ch, dt, right_hand); improve_stance (ch); } return; } activate = the_arti->points; if (activate > 1) { wield_obj = create_object (get_obj_index (ARTI_CROWN_OF_CHRYSTANCIA), 0); sprintf (movie_buf1, "The Crown of Chrystancia on your head blasts $N with a coruscating wave of energy. #w[ #r%d #w]#n", (dam / 10)); sprintf (movie_buf2, "The Crown of Chrystancia on $n's head blasts you with a coruscating wave of energy. #w[ #r%d #w]#n", (dam / 10)); sprintf (movie_buf3, "The Crown of Chrystancia on $n's head blasts $N with a coruscating wave of energy."); act (movie_buf1, ch, NULL, victim, TO_CHAR); act (movie_buf2, ch, NULL, victim, TO_VICT); act (movie_buf3, ch, NULL, victim, TO_NOTVICT); hurt_person (ch, victim, (dam / 10)); extract_obj (wield_obj); the_arti->points = 0; } else the_arti->points++; } if ((arti) && (IS_ARTIFACT (wield, ARTI_ICE_SHARD))) { if ((the_arti = get_artifact (ch, ARTI_ICE_SHARD)) == NULL) { bug ("Supposedly had Ice Shard, but couldn't find it.", 0); tail_chain (); if (!is_safe (ch, victim)) { improve_wpn (ch, dt, right_hand); improve_stance (ch); } return; } activate = the_arti->points; if (activate > 1) { non_katana_ice_sword (ch, wield); the_arti->points = 0; } else the_arti->points++; } } tail_chain (); if (!is_safe (ch, victim)) { improve_wpn (ch, dt, right_hand); improve_stance (ch); } return; } int add_bonuses (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt) { float mult = 1; float reduct = 1; int stance; int wpn; if (!IS_AWAKE (victim)) dam *= 2; ch->mult = 0; victim->reduct = 0; if (!IS_NPC (ch)) { /* Stance Bonuses.. */ stance = ch->stance[0]; if (IS_STANCE (ch, STANCE_NORMAL)) mult += .25; else dam = dambonus (ch, victim, dam, stance); /* ----------------- */ if (IS_CLASS (ch, CLASS_VAMPIRE)) { if (get_disc(ch, VAM_POTE) > 0) mult += (get_disc(ch, VAM_POTE) / 2); /* Vampire Day\Night Bonus Shit */ if (weather_info.sunlight == SUN_LIGHT && dam > 1 && !IS_IMMUNE (ch,IMM_SUNLIGHT)) mult -= .5; else mult += .5; } if (IS_CLASS (ch, CLASS_WEREWOLF)) { if (ch->pcdata->stats[UNI_RAGE] > 150) mult += .10; if (ch->gifts[PHILODOX] >= 4) mult += .6; if (ch->gifts[SHADOWLORDS] >= 1) mult += .7; if (ch->gifts[GETOFFENRIS] >= 3) mult += 1; if (ch->gifts[STARGAZERS] >= 1) mult += .3; if (ch->gifts[AHROUN] >= 1) mult += .3; if (ch->gifts[AHROUN] >= 2) mult += .3; if (ch->gifts[BLACKFURIES] >= 3) mult += .3; } if (IS_CLASS (ch, CLASS_MAGE)) { if (IS_SET (ch->mflags, MAGE_TELEKINETICS)) mult += .5; if (IS_SET (ch->mflags, MFLAGS_DIMMAK)) mult += .4; if (ch->spheres[MENT] >= 1) mult += (ch->spheres[MENT] * .3); } if (IS_CLASS (ch, CLASS_MONK)) { if (ch->chi[CURRENT] > 0) mult += (ch->chi[CURRENT] / 2); } if (IS_CLASS (ch, CLASS_FAE)) { mult += 1; if (IS_EXTRA2 (ch, EXTRA2_WYRM)) mult += 1.5; if (IS_EXTRA2 (ch, EXTRA2_FAEMIGHT)) mult += 3.5; } if (IS_CLASS (ch, CLASS_DROW)) { if IS_SET (ch->pcdata->powers[1], DPOWER_TOUGHSKIN) mult += 2.5; } if (IS_CLASS (ch, CLASS_DEMON)) { if (IS_DEMPOWER (ch, DEM_MIGHT)) mult += 1.7; if (IS_SET (ch->warp, WARP_WEAK)) mult -= .5; if (IS_SET (ch->warp, WARP_GBODY)) mult -= .5; if (IS_SET (ch->warp, WARP_STRONGARMS)) mult += 1; } if (IS_CLASS (ch, CLASS_DRAGON) && IS_SET (ch->pcdata->dragonaff, DRA_TERROR)) { mult += (GET_AGE(ch) / 4); } if (IS_CLASS (ch, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (ch, HPOWER_MIGHT)) mult += 1.7; } if (IS_CLASS (ch, CLASS_NINJA)) { if (ch->pcdata->powers[NPOWER_CHIKYU] > 1) mult += 3; } if (ch->move >= 50000) { mult += ch->move / 50000; } } if (!IS_NPC (victim)) { if (IS_ITEMAFF (victim, ITEMA_RESISTANCE)) reduct += 5; if (IS_CLASS (victim, CLASS_HIGHLANDER)) { reduct += 2; } if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (IS_DEMPOWER (victim, HPOWER_TOUGHNESS)) reduct += 1.7; } if (IS_CLASS (victim, CLASS_DRAGON) && IS_SET (victim->pcdata->dragonaff, DRA_TERROR)) { reduct += (GET_AGE(victim) / 4); } if (!IS_NPC (ch) && IS_CLASS (victim, CLASS_DRAGON) && IS_SET (victim->pcdata->dragonaff, DRA_TOUGHNESS)) { reduct += (GET_AGE(victim) / 4); } if (IS_CLASS (victim, CLASS_VAMPIRE)) { if (get_disc(victim, VAM_FORT) > 0) reduct += (get_disc(victim, VAM_FORT) * .6); } if (IS_CLASS (victim, CLASS_WEREWOLF)) { if (victim->pcdata->stats[UNI_RAGE] > 150) reduct += .5; if (victim->gifts[PHILODOX] >= 1) reduct += .1; if (victim->gifts[PHILODOX] >= 3) reduct += .2; if (victim->gifts[SHADOWLORDS] >= 2) reduct += .2; if (victim->gifts[SHADOWLORDS] >= 4) reduct += .3; if (IS_GAR1 (victim, WOLF_COCOON)) reduct += 1.25; } if (IS_CLASS (victim, CLASS_MAGE)) { if (IS_SET (victim->mflags, MAGE_BETTERBODY)) reduct += .75; if (IS_SET (victim->mflags, MAGE_POLYAPPEAR)) reduct += number_range (0, 4) * 0.3; if (victim->spheres[MENT] >= 0) reduct += victim->spheres[MENT] * 0.3; } if (IS_CLASS (victim, CLASS_FAE)) { reduct += 0.75; if (IS_SET (victim->extra2, EXTRA2_FAETOUGH)) reduct += 1.4; if (IS_EXTRA2 (victim, EXTRA2_WYRM)) reduct += 1.5; if (IS_GAR1 (victim, WW_GRANITE)) reduct += 3; } if (IS_CLASS (victim, CLASS_DEMON)) { if (IS_DEMPOWER (victim, DEM_TOUGH)) reduct += 1.4; if (IS_SET (victim->warp, WARP_SBODY)) reduct += 1.5; if (IS_SET (victim->warp, WARP_CBODY)) reduct += 1.5; if (IS_SET (victim->warp, WARP_STAMINA)) reduct += 2; } if (IS_CLASS (ch, CLASS_DEMON) && IS_SET (ch->warp, WARP_WEAK)) reduct += .5; if (IS_CLASS (victim, CLASS_MONK)) { if (victim->chi[CURRENT] > 0) reduct += victim->chi[CURRENT] / 2; if (victim->monkab[BODY] >= 2) reduct += .5; } if (IS_CLASS (victim, CLASS_DROW)) { reduct += 1; if IS_SET (victim->pcdata->powers[1], DPOWER_TOUGHSKIN) reduct += 2.5; } if (IS_CLASS (victim, CLASS_NINJA)) { reduct += 1.4; if (victim->pcdata->powers[NPOWER_CHIKYU] > 6) reduct += 2.25; } } if (IS_CLASS(ch, CLASS_WRAITH)) mult += 4; if (IS_CLASS(victim, CLASS_WRAITH)) reduct += 2; if (!IS_NPC (ch) && dt >= TYPE_HIT) { wpn = (dt - 1000); dam = dam + (dam * ((ch->wpn[wpn] + 1) / 100)); } if (!IS_NPC (victim)) { if (dt >= TYPE_HIT) { wpn = (dt - 1000); if ((wpn == 1 || wpn == 3) && IS_IMMUNE (victim, IMM_SLASH)) dam /= (number_range (1, 4)); if ((wpn == 2 || wpn == 11) && IS_IMMUNE (victim, IMM_STAB)) dam /= (number_range (1, 4)); if ((wpn == 6 || wpn == 7 || wpn == 8) && IS_IMMUNE (victim, IMM_SMASH)) dam /= (number_range (1, 4)); if ((wpn == 0 || wpn == 5 || wpn == 10) && IS_IMMUNE (victim, IMM_ANIMAL)) dam /= (number_range (1, 4)); if ((wpn == 4 || wpn == 9 || wpn == 12) && IS_IMMUNE (victim, IMM_MISC)) dam /= (number_range (1, 4)); } } if (IS_NPC (ch) && ch->level > 200) { mult += (ch->level / 200); } if (IS_NPC (victim)) { reduct += (victim->level / 200); reduct += 1; } ch->mult = mult; victim->reduct = reduct; dam *= mult; dam /= reduct; return dam; } bool can_counter (CHAR_DATA * ch) { if (IS_STANCE (ch, STANCE_MONKEY)) return TRUE; return FALSE; } bool can_bypass (CHAR_DATA * ch, CHAR_DATA * victim) { /* if (IS_NPC (ch)) // || IS_NPC (victim)) -- BS... You can bypass mob parry/dodge. return FALSE; */ //else if (IS_STANCE (ch, STANCE_VIPER)) return TRUE; else if (IS_STANCE (ch, STANCE_MANTIS)) return TRUE; else if (IS_STANCE (ch, STANCE_TIGER)) return TRUE; return FALSE; } int oupdate_damcap (CHAR_DATA * ch, CHAR_DATA * victim) { int vic_ac; int dam=0; if (is_safe(ch, victim)) return 0; vic_ac = char_ac(victim) * 0.01; dam -= vic_ac; if (dam <= 0) dam = 1; if (dam > 1000000) dam = 1000000; if (IS_AFFECTED(victim, AFF_PROTECT) && IS_EVIL(ch)) dam -= dam * 0.25; if ( (IS_AFFECTED (victim, AFF_SANCTUARY) && dam > 1 ) || ( WORN_ARTIFACT( victim, ARTI_CLOAK_OF_THE_ARCHMAGI ) && dam > 1 ) ) dam *= 0.5; /* if ( IS_AFFECTED(victim, AFF_HOLYAURA)) dam *= 0.5;*/ if (IS_ITEMAFF(victim, ITEMA_RESISTANCE)) dam -= dam * 0.25; return dam; } void update_damcap (CHAR_DATA * ch, CHAR_DATA * victim) { OBJ_DATA *obj1; OBJ_DATA *obj2; OBJ_DATA *obj3; OBJ_DATA *obj4; int max_dam = 1000; if (IS_NPC (ch)) { max_dam += (ch->level * 100); // for NPCs #ifdef FUCK_PLAYERS max_dam = 30000; #endif } else { if (IS_CLASS (ch, CLASS_FAE)) { max_dam += 2700; if (IS_EXTRA2 (ch, EXTRA2_FAEMIGHT)) max_dam += 1050; } // 4750 if (IS_CLASS (ch, CLASS_DROW)) { if (ch->pcdata->stats[UNI_GEN] < 3) max_dam += 3000; else if (ch->pcdata->stats[UNI_GEN] < 4) max_dam += 2800; else if (ch->pcdata->stats[UNI_GEN] < 5) max_dam += 2700; else if (ch->pcdata->stats[UNI_GEN] < 6) max_dam += 2600; else max_dam += 2500; if (weather_info.sunlight == SUN_DARK) max_dam += 1050; if (IS_SET (ch->newbits, NEW_DROWHATE)) max_dam += 1050; if (IS_SET (ch->special, SPC_DROW_WAR)) max_dam += 250; if (IS_SET (ch->special, SPC_DROW_ASN)) max_dam += 250; else if (IS_SET (ch->special, SPC_DROW_MAG)) max_dam += 200; else if (IS_SET (ch->special, SPC_DROW_CLE)) max_dam += 150; } if (IS_CLASS(ch,CLASS_WRAITH)) { if (ch->arcanoi[WRAGE] == 0) max_dam += 2500; if (ch->arcanoi[WRAGE] == 1) max_dam += 3000; if (ch->arcanoi[WRAGE] == 2) max_dam += 3250; if (ch->arcanoi[WRAGE] == 3) max_dam += 3750; if (ch->arcanoi[WRAGE] == 4) max_dam += 4000; if (ch->arcanoi[WRAGE] >= 5) max_dam += 4500; } if (IS_CLASS (ch, CLASS_DEMON)) { if (ch->pcdata->stats[UNI_GEN] < 3) max_dam += 1500; else if (ch->pcdata->stats[UNI_GEN] < 4) max_dam += 1400; else if (ch->pcdata->stats[UNI_GEN] < 5) max_dam += 1300; else if (ch->pcdata->stats[UNI_GEN] < 6) max_dam += 1200; else max_dam += 1100; if (IS_SET (ch->special, SPC_DEMON_LORD)) max_dam += 500; else if (IS_SET (ch->special, SPC_PRINCE)) max_dam += 400; else if (IS_SET (ch->special, SPC_SIRE)) max_dam += 300; else max_dam += 100; if (ch->in_room != NULL && ch->in_room->vnum == 30000) max_dam += 20000; max_dam += (ch->pcdata->stats[DEMON_POWER] * 20); max_dam += 1000; } if (!IS_NPC (ch) && IS_SET (ch->warp, WARP_DAMCAP)) max_dam += 800; if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_DEMON) && IS_DEMPOWER (ch, DEM_MIGHT)) max_dam += 200; if (IS_CLASS (ch, CLASS_DRAGON)) { max_dam += GET_AGE(ch) * 100; if (ch->pcdata->stats[UNI_GEN] < 3) max_dam += 2500; else if (ch->pcdata->stats[UNI_GEN] < 4) max_dam += 2400; else if (ch->pcdata->stats[UNI_GEN] < 5) max_dam += 2300; else if (ch->pcdata->stats[UNI_GEN] < 6) max_dam += 2200; else max_dam += 2100; } if (IS_CLASS (ch, CLASS_VAMPIRE)) { if (ch->pcdata->stats[UNI_GEN] < 3) max_dam += 2500; else if (ch->pcdata->stats[UNI_GEN] < 4) max_dam += 2400; else if (ch->pcdata->stats[UNI_GEN] < 5) max_dam += 2300; else if (ch->pcdata->stats[UNI_GEN] < 6) max_dam += 2200; else max_dam += 2100; max_dam += (ch->pcdata->stats[UNI_RAGE]); if (ch->pcdata->rank == AGE_METHUSELAH) max_dam += 750; else if (ch->pcdata->rank == AGE_ELDER) max_dam += 300; else if (ch->pcdata->rank == AGE_ANCILLA) max_dam += 150; if (get_disc(ch, VAM_POTE) > 0) max_dam += (200 * get_disc(ch, VAM_POTE)); if IS_SET (ch->newbits, NEW_TIDE) max_dam += 500; } if (IS_CLASS (ch, CLASS_MONK)) { max_dam += 300; if (ch->pcdata->stats[UNI_GEN] < 3) max_dam += 1700; else if (ch->pcdata->stats[UNI_GEN] < 4) max_dam += 1600; else if (ch->pcdata->stats[UNI_GEN] < 5) max_dam += 1500; else max_dam += 1400; if (ch->monkab[COMBAT] > 0) max_dam += (ch->monkab[COMBAT] * 100); if (ch->chi[CURRENT] > 0) max_dam += (ch->chi[CURRENT] * 200); } if (IS_CLASS (ch, CLASS_NINJA)) { if (ch->pcdata->stats[UNI_GEN] < 3) max_dam += 1700; else if (ch->pcdata->stats[UNI_GEN] < 4) max_dam += 1600; else if (ch->pcdata->stats[UNI_GEN] < 5) max_dam += 1500; else max_dam += 1400; max_dam += (ch->pcdata->stats[UNI_RAGE] * 5); if (ch->pcdata->powers[NPOWER_CHIKYU] >= 6 && ch->pcdata->powers[HARA_KIRI] > 0) max_dam += 800; if (ch->pcdata->powers[NPOWER_CHIKYU] >= 2) max_dam += 550; } if (IS_CLASS (ch, CLASS_MAGE)) { max_dam += 1500; if (ch->pcdata->stats[UNI_GEN] < 3) max_dam += 2500; else if (ch->pcdata->stats[UNI_GEN] < 4) max_dam += 2400; else if (ch->pcdata->stats[UNI_GEN] < 5) max_dam += 2300; else if (ch->pcdata->stats[UNI_GEN] < 6) max_dam += 2200; else max_dam += 2100; if (ch->spheres[MENT] > 0) max_dam += (200 * ch->spheres[MENT]); } if (IS_CLASS (ch, CLASS_WEREWOLF)) { if (ch->pcdata->stats[UNI_GEN] < 3) max_dam += 2700; else if (ch->pcdata->stats[UNI_GEN] < 4) max_dam += 2600; else if (ch->pcdata->stats[UNI_GEN] < 5) max_dam += 2500; else max_dam += 2300; if (weather_info.moonphase == MOON_HALF && weather_info.time_of_day == NIGHT) max_dam += 500; if (weather_info.moonphase == MOON_FULL && weather_info.time_of_day == NIGHT) max_dam += 1000; if (IS_SET (ch->special, SPC_WOLFMAN)) max_dam += (ch->pcdata->stats[UNI_RAGE]); if (ch->gifts[PHILODOX] >= 3) max_dam += 400; if (ch->gifts[SILVERFANGS] > 0) max_dam += 300; if (ch->gifts[GETOFFENRIS] >= 3) max_dam += 400; if (IS_ITEMAFF (ch, ITEMA_SUNSHIELD)) max_dam += 500; } if (IS_CLASS (ch, CLASS_HIGHLANDER)) { if (get_eq_char (ch, WEAR_DUAL) != NULL) { max_dam += (ch->wpn[1] * 3.3); // max_dam += (ch->race * 10); } else { max_dam += (ch->wpn[0] * 3.0); // max_dam += (ch->race * 10); } } } /* Crab Monkey and Swallow take damcap? */ if (victim->stance[0] != STANCE_MONKEY) { int stance = ch->stance[0]; if (ch->stance[0] == STANCE_BULL) max_dam += ch->stance[stance]; else if (ch->stance[0] == STANCE_DRAGON) max_dam += ch->stance[stance]; else if (ch->stance[0] == STANCE_TIGER) max_dam += ch->stance[stance]; } if (ch->stance[0] != STANCE_MONKEY) { int stance = victim->stance[0]; if (victim->stance[0] == STANCE_CRAB) max_dam -= victim->stance[stance]; else if (victim->stance[0] == STANCE_DRAGON) max_dam -= victim->stance[stance]; else if (victim->stance[0] == STANCE_SWALLOW) max_dam -= victim->stance[stance]; } /* Legend Status Bonuses */ if (!IS_NPC (ch)) { if (ch->lstatus == 1) max_dam += 50; if (ch->lstatus == 2) max_dam += 100; if (ch->lstatus == 3) max_dam += 200; if (ch->lstatus == 4) max_dam += 300; if (ch->lstatus == 5) max_dam += 400; if (ch->lstatus == 6) max_dam += 500; if (ch->lstatus == 7) max_dam += 1000; if (ch->lstatus == 8) max_dam += 1500; if (ch->lstatus == 9) max_dam += 2000; if (ch->lstatus == 10) max_dam += 2500; if (ch->lstatus == 11) max_dam += 3500; } /* Status Damcap 50/status */ if (!IS_NPC (ch)) max_dam += (ch->race * 100); /* if (IS_ITEMAFF (ch, ITEMA_ARTIFACT)) max_dam += 500; if (IS_ITEMAFF (victim, ITEMA_ARTIFACT)) max_dam -= 500;*/ if (IS_SUPER_NPC (ch)) max_dam += ch->level * 2; if (IS_SUPER_NPC (victim)) max_dam -= victim->level / 2; // Updated by Serenity to be victim not CH if (max_dam < 1000) max_dam = 1000; if (max_dam > 20000) max_dam = 20000; if (ch->level >= LEVEL_BUILDER) max_dam = 30000; if (IS_EXTRA2 (ch, EXTRA2_INFECTED) && IS_PARA (3)) max_dam *= 1.25; // moved this AHEAD of the setting of damcap otherwise it's worthless -- Serenity // wielded/held Arti stuff obj1 = get_eq_char (ch, WEAR_HOLD); obj2 = get_eq_char (ch, WEAR_WIELD); obj3 = get_eq_char (ch, WEAR_THIRD); obj4 = get_eq_char (ch, WEAR_FOURTH); if (obj4 == NULL) obj4 = get_eq_char (ch, WEAR_DUAL); if (WORN_ARTIFACT (ch, ARTI_MAIDENS_BREATH)) max_dam += 500; else if (WORN_ARTIFACT (ch, ARTI_RING_AURELIUS)) max_dam += 500; else if (WORN_ARTIFACT (ch, ARTI_DEMONS_HEART)) max_dam += 500; else if (WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS)) max_dam += 250; else if (WORN_ARTIFACT (ch, ARTI_PLATE_IRON_GAUNTLET)) max_dam += 1000; else if (WORN_ARTIFACT (ch, ARTI_LIONS_MANE)) max_dam += 750; else if (WORN_ARTIFACT (ch, ARTI_CROWN_OF_CHRYSTANCIA)) max_dam += 500; else if (ANY_ARTIFACT (obj1, obj2, obj3, obj4, ARTI_METEORIC_AXE)) max_dam += 500; else if (ANY_ARTIFACT (obj1, obj2, obj3, obj4, ARTI_ICE_SHARD)) max_dam += 250; else if (ANY_ARTIFACT (obj1, obj2, obj3, obj4, ARTI_KATANA_MURAMASE)) max_dam += 750; else if (ANY_ARTIFACT (obj1, obj2, obj3, obj4, ARTI_EMPERORS_BLADE)) max_dam += 250; else { int x; for (x = ARTI_GREEN_PLANAR_RING; x <= ARTI_WYRM_BLADE; x++) if (WORN_ARTIFACT (ch, x)) max_dam += 500; } ch->damcap[DAM_CAP] = max_dam; ch->damcap[DAM_CHANGE] = 0; return; } /* * Inflict damage from a hit. */ void damage (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt) { bool BYPASSING = FALSE; CHAR_DATA *emb; int max_dam = ch->damcap[DAM_CAP]; /* Embrace Fix!*/ if (!IS_NPC(ch) && ch->embracing != NULL ) { if ( ( emb = ch->embracing ) != NULL ) stop_embrace(ch,emb); else stop_embrace(ch,NULL); } if (IS_CREATOR (ch)) max_dam = 10000000; if (get_hours (ch) < 6 && !IS_NPC (ch) && !IS_SET (ch->extra2, PKREADY)) dam *= 3; if (get_hours (victim) < 6 && !IS_NPC (victim) && !IS_SET (victim->extra2, PKREADY)) dam /= 2; if (victim == NULL || victim->position == POS_DEAD) return; /* * Stop up any residual loopholes. */ if (!IS_NPC (ch) && IS_ITEMAFF (ch, ITEMA_PEACE)) { send_to_char ("You are unable to attack them.\n\r", ch); return; } if (!IS_NPC (victim) && IS_ITEMAFF (victim, ITEMA_PEACE)) { send_to_char ("You can't seem to attack them.\n\r", ch); return; } if (ch->damcap[DAM_CHANGE] == 1) { update_damcap (ch, victim); max_dam = ch->damcap[DAM_CAP]; // after we update the damcap, let's assign it eh? -- serenity } if (dam > max_dam) dam = max_dam; if (victim != ch) { /* * Certain attacks are forbidden. * Most other attacks are returned. */ if (is_safe (ch, victim)) return; check_killer (ch, victim); if (victim->position > POS_STUNNED) { if (victim->fighting == NULL) set_fighting (victim, ch); victim->position = POS_FIGHTING; } if (victim->position > POS_STUNNED) { if (ch->fighting == NULL) set_fighting (ch, victim); /* * If victim is charmed, ch might attack victim's master. */ if (IS_NPC (ch) && IS_NPC (victim) && IS_AFFECTED (victim, AFF_CHARM) && victim->master != NULL && victim->master->in_room == ch->in_room && number_bits (3) == 0) { stop_fighting (ch, FALSE); multi_hit (ch, victim->master, TYPE_UNDEFINED); return; } } /* * More charm stuff. */ if (victim->master == ch) stop_follower (victim); /* * Damage modifiers. */ if ((IS_CLASS (ch, CLASS_HIGHLANDER)) && (IS_DEMPOWER (ch, HPOWER_HEAL))) { if (IS_AFFECTED (ch, AFF_HIDE)) { dam *= 1.65; stc ("You use your healing knowledge to place a grievous wound in your foe.\n\r", ch); //if ( number_range( 1, 100 ) < 95 ) REMOVE_BIT (ch->affected_by, AFF_HIDE); act ("$n places a cruel blow deep into your vitals.", ch, NULL, NULL, TO_ROOM); } } else if (IS_AFFECTED (ch, AFF_HIDE)) { if (!can_see (victim, ch)) { dam *= 1.5; send_to_char ("You use your concealment to get a surprise attack!\n\r", ch); } REMOVE_BIT (ch->affected_by, AFF_HIDE); act ("$n leaps from $s concealment.", ch, NULL, NULL, TO_ROOM); } if (IS_CLASS (ch, CLASS_NINJA) && IS_SET (ch->act, PLR_WIZINVIS)) { if (!can_see (victim, ch)) { dam *= 3; send_to_char ("You leap from the shadows.\n\r", ch); } REMOVE_BIT (ch->act, PLR_WIZINVIS); act ("$n leaps from the shadows.", ch, NULL, NULL, TO_ROOM); BYPASSING = TRUE; } else if (IS_CLASS (ch, CLASS_MONK) && IS_SET (ch->act, PLR_WIZINVIS)) { if (!can_see (victim, ch)) { dam *= 1.2; send_to_char ("You burst from a flash of light.\n\r", ch); } REMOVE_BIT (ch->act, PLR_WIZINVIS); act ("$n bursts from a flash of light.", ch, NULL, NULL, TO_ROOM); } if ( (IS_AFFECTED (victim, AFF_SANCTUARY) && dam > 1 ) || ( WORN_ARTIFACT( victim, ARTI_CLOAK_OF_THE_ARCHMAGI ) && dam > 1 ) ) {/* if ( IS_CLASS( ch, CLASS_HIGHLANDER ) && IS_DEMPOWER( ch, HPOWER_USE_SHIELDLESS ) ) { if ( ch->quickening[0] >= 3 && number_percent() < 80 ) { dam = dam; ch->quickening[0] -= number_range( 0, 3 ); } else dam *= 0.5; } else*/ dam *= 0.5; } if (IS_AFFECTED (victim, AFF_PROTECT) && IS_EVIL (ch) && dam > 1) dam -= (dam * 0.25); if (dam < 0) dam = 0; /* * Check for disarm, trip, parry, and dodge. */ if (dt >= TYPE_HIT) { if (IS_NPC (ch) && number_percent () < ch->level * 0.5) disarm (ch, victim); /* if ( IS_NPC(ch) && number_percent( ) < ch->level * 0.5 ) trip( ch, victim ); */ if ((IS_CLASS (ch, CLASS_HIGHLANDER)) && (IS_DEMPOWER (ch, HPOWER_USE_BYPASS)) && (!BYPASSING)) { if ((ch->quickening[0] >= 1) && (dam > 0)) { ch->quickening[0] -= 1; // Auto-Bypass...If they spend 1 quickening. if (number_range (1, 100) < 70) { stc ("#c^#n", ch); BYPASSING = TRUE; } else { BYPASSING = FALSE; } } } if (!BYPASSING) { if (check_parry (ch, victim, dt)) return; if (IS_STANCE (victim, STANCE_CRANE) && victim->stance[STANCE_CRANE] > 100 && !can_counter (ch) && !can_bypass (ch, victim) && check_parry (ch, victim, dt)) return; else if (IS_STANCE (victim, STANCE_MANTIS) && victim->stance[STANCE_MANTIS] > 100 && !can_counter (ch) && !can_bypass (ch, victim) && check_parry (ch, victim, dt)) return; if (check_dodge (ch, victim, dt)) return; if (IS_STANCE (victim, STANCE_MONGOOSE) && victim->stance[STANCE_MONGOOSE] > 100 && !can_counter (ch) && !can_bypass (ch, victim) && check_dodge (ch, victim, dt)) return; else if (IS_STANCE (victim, STANCE_SWALLOW) && victim->stance[STANCE_SWALLOW] > 100 && !can_counter (ch) && !can_bypass (ch, victim) && check_dodge (ch, victim, dt)) return; } } dam_message (ch, victim, dam, dt); if (!IS_NPC (ch) && IS_SET (ch->more, SHORT_COMBAT)) { ch->amount_damage_dealt += dam; ch->amount_attacks_dealt++; } if (!IS_NPC (victim) && IS_SET (victim->more, SHORT_COMBAT)) { victim->amount_damage_received += dam; victim->amount_attacks_received++; } } hurt_person (ch, victim, dam); return; } void adv_damage (CHAR_DATA * ch, CHAR_DATA * victim, int dam) { int max_dam = 0; max_dam = ch->damcap[DAM_CAP]; // after we update the damcap, let's assign it eh? -- serenity if (victim == NULL) return; if (victim->position == POS_DEAD) return; if (ch->damcap[DAM_CHANGE] == 1) { update_damcap (ch, victim); max_dam = ch->damcap[DAM_CAP]; // after we update the damcap, let's assign it eh? -- serenity } if (dam > max_dam) dam = max_dam; if (victim != ch) { if (is_safe (ch, victim)) return; check_killer (ch, victim); if (victim->position > POS_STUNNED) { if (victim->fighting == NULL) set_fighting (victim, ch); } if (victim->position > POS_STUNNED) { if (ch->fighting == NULL) set_fighting (ch, victim); /* * If victim is charmed, ch might attack victim's master. */ if (IS_NPC (ch) && IS_NPC (victim) && IS_AFFECTED (victim, AFF_CHARM) && victim->master != NULL && victim->master->in_room == ch->in_room && number_bits (3) == 0) { stop_fighting (ch, FALSE); multi_hit (ch, victim->master, TYPE_UNDEFINED); return; } } if (victim->master == ch) stop_follower (victim); if ( (IS_AFFECTED (victim, AFF_SANCTUARY) && dam > 1 ) || ( WORN_ARTIFACT( victim, ARTI_CLOAK_OF_THE_ARCHMAGI ) && dam > 1 ) ) dam *= 0.5; if (IS_AFFECTED (victim, AFF_PROTECT) && IS_EVIL (ch) && dam > 1) dam -= (dam * 0.25); if (dam < 0) dam = 0; } return; } void hurt_person (CHAR_DATA * ch, CHAR_DATA * victim, int dam) { bool is_npc = FALSE; bool same_room = FALSE; bool remote_room = FALSE; int old_hp = 0; int tierxp = 0; // int vnum; char buf[MSL]; #ifdef FUCK_PLAYERS if (IS_NPC (victim) && !IS_NPC (ch)) dam /= 1000; if (!IS_NPC (ch) && !IS_NPC (victim)) dam /= 1000; #endif /* * Hurt the victim. * Inform the victim of his new state. */ if (WORN_ARTIFACT (ch, ARTI_SHATTERED_BLADE)) dam *= 1.25; if (WORN_ARTIFACT (ch, ARTI_DEMONS_HEART)) dam *= 1.25; if (WORN_ARTIFACT (ch, ARTI_LIONS_MANE) && IS_SET(ch->more, MORE_LIONSMANE)) dam *= 1.25; if (WORN_ARTIFACT (ch, ARTI_PLATE_IRON_GAUNTLET)) dam *= 1.1; if (WORN_ARTIFACT (ch, ARTI_METEORIC_AXE)) dam *= 1.1; if (WORN_ARTIFACT (ch, ARTI_CROWN_OF_CHRYSTANCIA)) dam *= 1.1; if (WORN_ARTIFACT (victim, ARTI_GREENLEAF_CLOAK) && !IS_SET (victim->flag2, AFF2_INARENA) && victim->in_room != NULL && victim->in_room->sector_type != SECT_INSIDE && victim->in_room->sector_type != SECT_CITY) dam *= 0.75; if (WORN_ARTIFACT (victim, ARTI_ARCHANGELS_WING) && number_percent() > 50) { char buf [MAX_STRING_LENGTH]; dam = (dam * number_range(1,99)) / 100; sprintf (buf, "The Archangel's Wing protects %s and reduces their damage to %d.\n\r", victim->name, dam); if (!IS_SET (ch->more, SHORT_COMBAT)) send_to_char (buf, ch); if (!IS_SET (victim->more, SHORT_COMBAT)) sprintf (buf, "The Archangel's Wing protects you and reduces the damage to %d.\n\r", dam); send_to_char (buf, victim); } if (WORN_ARTIFACT (victim, ARTI_CRYSTAL_SHIELD)) { if (number_range(0,99) < number_range(5,10)) { char buf [MAX_STRING_LENGTH]; sprintf (buf, "%s uses the Crystal Shield to deflect your hit.\n\r", victim->name); if (!IS_SET (ch->more, SHORT_COMBAT)) send_to_char (buf, ch); if (!IS_SET (victim->more, SHORT_COMBAT)) stc ("You deflect their hit with the Crystal Shield.\n\r", victim); dam = 0; } } old_hp = victim->hit; victim->hit -= dam; if (IS_SET (victim->flag2, AFF2_INARENA) && victim->hit < 0) clean_arena (victim, ch); if (!IS_NPC (victim) && victim->level >= LEVEL_IMMORTAL && victim->hit < 1) victim->hit = 1; update_pos (victim); switch (victim->position) { case POS_MORTAL: act ("$n is mortally wounded, and spraying blood everywhere.", victim, NULL, NULL, TO_ROOM); send_to_char ("You are mortally wounded, and spraying blood everywhere.\n\r", victim); //MORTAL MESS if (!IS_NPC (victim) && !IS_NPC (ch) && ch->mort_count == 0 && ch != victim) { if (!IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING)) { sprintf (buf, "#r%s #whas been mortally wounded by #r%s at #y%s", victim->name, ch->name, (get_room_index (victim->in_room->vnum))->name); if (old_hp > -5) do_fatality (ch, buf); // ltf(buf, "mortalwound", FALSE); ch->mort_count = 1; } } if (WORN_ARTIFACT (victim, ARTI_HEART_OF_DARKNESS) && IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS) ) REMOVE_BIT(victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (IS_CLASS (victim, CLASS_DROW) && IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (IS_CLASS(victim, CLASS_FAE) && IS_KITH (victim, KITH_SLUAGH) && IS_SET(victim->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (IS_CLASS (victim, CLASS_MONK) && IS_SET (victim->monkstuff, MONK_HEAL)) REMOVE_BIT (victim->monkstuff, MONK_HEAL); break; case POS_INCAP: act ("$n is incapacitated, and bleeding badly.", victim, NULL, NULL, TO_ROOM); send_to_char ("You are incapacitated, and bleeding badly.\n\r", victim); //victim->last_mort = 300; break; case POS_STUNNED: act ("$n is stunned, but will soon recover.", victim, NULL, NULL, TO_ROOM); send_to_char ("You are stunned, but will soon recover.\n\r", victim); //victim->last_mort = 300; break; case POS_DEAD: act ("$n is DEAD!!", victim, 0, 0, TO_ROOM); send_to_char ("You have been KILLED!!\n\r\n\r", victim); break; default: if (dam > victim->max_hit / 4) send_to_char ("That really did #rHURT!\n\r", victim); if (victim->hit < victim->max_hit / 4 && dam > 0) { if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_VAMPIRE) && number_percent () < victim->beast) vamp_rage (victim); } break; } /* * Sleep spells and extremely wounded folks. */ if (!IS_AWAKE (victim)) stop_fighting (victim, FALSE); /* * Payoff for killing things. */ if (victim->position == POS_DEAD) { group_gain (ch, victim); if (!IS_NPC (victim)) { sprintf (log_buf, "%s killed by %s at %d", victim->name, (IS_NPC (ch) ? ch->short_descr : ch->name), victim->in_room->vnum); log_string (log_buf, ch); wiznet (ch, WIZ_DEATHS, 7, log_buf); // wiznet /* * Dying penalty: * 1/2 your current exp. */ if (victim->exp > 0) victim->exp = victim->exp / 2; } demon_gain (ch, victim); if (IS_NPC (victim) && !IS_NPC (ch)) { // ch->mkill += 1; if ((IS_CLASS(ch, CLASS_DROW) && IS_SET (ch->special, SPC_DROW_CLE))) { if (ch->cleregen >= 100000) { stc("You have the maximum amount of points stored.\n\r",ch); } else { sprintf(buf,"#cYou store#e %d #cpoints from that kill.#n\n\r",victim->level / 2); stc(buf,ch); ch->cleregen += victim->level / 2; } } if (ch->level == 1 && ch->mkill > 4) { ch->level = 2; do_save (ch, ""); } } if (!IS_NPC (ch) && ch->tier < 250 && IS_NPC(victim) && !IS_SET(victim->act, ACT_NOEXP)) { tierxp = number_range ((victim->level / 4), victim->level); if ((WizConfig->xpbonus > 1) && (get_hours (ch) >= 6)) tierxp = tierxp * WizConfig->xpbonus; ch->tierxp += tierxp; if (ch->tierxp > (ch->tier * 100000)) { ch->tierxp = 0; ch->tier++; stc ("#r->^1#wYou gain a Tier!#n#r<-#n\n\r", ch); gainstats (ch); } } if (IS_NPC (victim)) is_npc = TRUE; if (victim->in_room == ch->in_room) same_room = TRUE; if (IS_CLASS (ch, CLASS_MAGE) && (!same_room) && (is_npc)) { raw_kill(victim, ch); remote_room = TRUE; } else raw_kill (victim, ch); //ok raw kill is here. if (same_room) { OBJ_DATA *payday = NULL; bool winner = FALSE; if (ch != NULL && ch->in_room != NULL && ch->in_room->contents != NULL) for ( payday = ch->in_room->contents; payday != NULL; payday = payday->next_content ) { if (!payday) break; if (payday->item_type != 23 && payday->item_type != 24) continue; if (payday->contains == NULL) break; winner = TRUE; break; } if (winner && IS_SET (ch->act, PLR_AUTOLOOT)) do_get (ch, "all corpse"); if (winner && IS_SET (ch->more, PLR_AUTOGOLD)) do_get (ch, "all.priceless corpse auto"); } if (IS_SET (ch->flag2, LOOKINCORPSE) && same_room) do_look (ch, "in corpse"); if (!IS_NPC (ch)) { if (IS_SET (ch->act, PLR_AUTOSAC) && same_room) { if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_DRAGON)) do_consume (ch, "corpse"); else do_sacrifice (ch, "corpse"); } /* else if (IS_SET (ch->act, PLR_AUTOSAC) && remote_room) { do_get (ch, "all.priceless corpse auto"); do_silent_sacrifice (ch, "corpse"); } */ } /* if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_DRAGON)) { if (IS_SET (ch->extra2, AUTOCONSUME) && same_room) do_consume (ch, "corpse"); }*/ return; } if (victim == ch) return; /* * Take care of link dead people. */ if (!IS_NPC (victim) && victim->desc == NULL) { if (number_range (0, victim->wait) == 0) { do_flee (victim, " "); return; } } /* * Wimp out? */ if (IS_NPC (victim) && dam > 0) { if ((IS_SET (victim->act, ACT_WIMPY) && number_bits (1) == 0 && victim->hit < victim->max_hit / 2) || (IS_AFFECTED (victim, AFF_CHARM) && victim->master != NULL && victim->master->in_room != victim->in_room)) do_flee (victim, ""); } if (!IS_NPC (victim) && victim->hit > 0 && victim->hit <= victim->wimpy && number_range (0, victim->wait) == 0) do_flee (victim, ""); tail_chain (); return; } bool newis_safe (CHAR_DATA * ch, CHAR_DATA * victim) { OBJ_DATA *obj; OBJ_DATA *obj_next; if (ch->trust > LEVEL_BUILDER && ch != victim) { send_to_char ("You cannot fight if you have implementor powers!\n\r", ch); return TRUE; } if (victim->trust > LEVEL_BUILDER && ch != victim) { send_to_char ("You cannot fight someone with implementor powers!\n\r", ch); return TRUE; } if (IS_SET (ch->tag_flags, TAG_PLAYING) || IS_SET (victim->tag_flags, TAG_PLAYING)) { stc ("Not during a game of Freeze Tag!\n\r", ch); return TRUE; } if (ch->in_room->vnum == ROOM_VNUM_ALOSER || ch->in_room->vnum == ROOM_VNUM_AWINNER) { stc ("Not in the Arena Winner/Loser rooms.\n\r", ch); return TRUE; } if (WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS) && IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS) ) REMOVE_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (WORN_ARTIFACT (victim, ARTI_HEART_OF_DARKNESS) && IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS) ) REMOVE_BIT(victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS (ch, CLASS_DROW) && IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS (victim, CLASS_DROW) && IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS(ch, CLASS_FAE) && IS_KITH (ch, KITH_SLUAGH) && IS_SET(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS(victim, CLASS_FAE) && IS_KITH (victim, KITH_SLUAGH) && IS_SET(victim->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (ch->flag2, AFF2_INARENA) && IS_SET(victim->flag2, AFF2_INARENA)) return FALSE; else if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (ch->war, WARRING) && IS_SET (victim->war, WARRING)) return FALSE; else if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (ch->war, JOINING)) { stc ("You are unable to start hostilities just before your war!\n\r", ch); return TRUE; } else if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (victim->war, JOINING)) { stc ("You are unable to start hostilities just before their war!\n\r", ch); return TRUE; } /* Make it so newbies cant be killed by players. */ if (!IS_NPC (victim) && (get_hours (ch) < 10) && !IS_NPC (ch) && (ch != victim) && !IS_SET (ch->extra2, PKREADY)) { stc ("You are unable to attack players untill you reach 10 hours!.\n\r", ch); return TRUE; } if (!IS_NPC (ch) && (get_hours (victim) < 10) && !IS_NPC (victim) && (ch != victim) && !IS_SET (victim->extra2, PKREADY)) { stc ("You are unable to attack newbies of under 10 hours!\n\r", ch); return TRUE; } if (!IS_NPC (victim) && nosafe) { return FALSE; } if (!IS_NPC (victim) && IS_SET (victim->newbits, NEW_NOTEWRITE)) { stc ("They are posting a note!\n\r", ch); return TRUE; } /* if ((IS_SET(ch->flag2, AFF2_INARENA) && !IS_SET(victim->flag2,AFF2_INARENA)) || (IS_SET(victim->flag2, AFF2_INARENA) && !IS_SET(ch->flag2,AFF2_INARENA))) { send_to_char( "You cannot interfere with arena battles\n\r", ch ); return TRUE; } */ // People with artifacts aren't safe. - Krynn for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (IS_SET (obj->quest, QUEST_ARTIFACT)) return FALSE; } /* Ethereal people can only attack other ethereal people */ if (!IS_NPC (ch) && get_trust (ch) == LEVEL_BUILDER) { send_to_char ("Don't fight, build.\n\r", ch); return TRUE; } if (!IS_NPC (victim) && get_trust (victim) == LEVEL_BUILDER) { send_to_char ("They build, not fight.\n\r", ch); return TRUE; } if (IS_AFFECTED (ch, AFF_ETHEREAL) && !IS_AFFECTED (victim, AFF_ETHEREAL)) { send_to_char ("You cannot while ethereal.\n\r", ch); return TRUE; } if (!IS_AFFECTED (ch, AFF_ETHEREAL) && IS_AFFECTED (victim, AFF_ETHEREAL)) { send_to_char ("You cannot fight an ethereal person.\n\r", ch); return TRUE; } /* You cannot attack across planes */ if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && !IS_AFFECTED (victim, AFF_SHADOWPLANE)) { act ("You are too insubstantial!", ch, NULL, victim, TO_CHAR); return TRUE; } if (!IS_AFFECTED (ch, AFF_SHADOWPLANE) && IS_AFFECTED (victim, AFF_SHADOWPLANE)) { act ("$E is too insubstantial!", ch, NULL, victim, TO_CHAR); return TRUE; } if (IS_HEAD (ch, LOST_HEAD) || IS_EXTRA (ch, EXTRA_OSWITCH)) { send_to_char ("Objects cannot fight!\n\r", ch); return TRUE; } else if (IS_HEAD (victim, LOST_HEAD) || IS_EXTRA (victim, EXTRA_OSWITCH)) { send_to_char ("You cannot attack an object.\n\r", ch); return TRUE; } //EARTHMELD CHECK if (!IS_NPC (ch) && IS_EXTRA (ch, EXTRA_EARTHMELD)) return TRUE; if (!IS_NPC (victim) && IS_EXTRA (victim, EXTRA_EARTHMELD)) return TRUE; if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return TRUE; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return TRUE; } if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_STEELSHIELD)) { send_to_char ("You cannot attack while in Majesty.\n\r", ch); return TRUE; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_STEELSHIELD)) { send_to_char ("They are far to imposing.\n\r", ch); return TRUE; } /* Thx Josh! */ if (victim->fighting == ch) return FALSE; /* You might be attacking them while they attack someone else */ if (ch->fighting == victim) return FALSE; // People with artifacts aren't safe. - Krynn for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (IS_SET (obj->quest, QUEST_ARTIFACT)) return FALSE; } /* Deal with safe rooms (either you or they are in one) */ if (ch->in_room == NULL || victim->in_room == NULL || IS_SET (ch->in_room->room_flags, ROOM_SAFE) || IS_SET (victim->in_room->room_flags, ROOM_SAFE)) { /* REASONING: * If you're in a safe room, you cannot attack someone if: * 1) They have no fight timer, AND: * 2) They do not have an artifact. * If either (or both) of the above statements are not true (ie * they DO have a fight timer, and/or they have an artifact) then * the safe room does not make them safe. * * The reverse logic is necessary because you cannot simply * return at this point - artifacts and fight timers ONLY * affect combat within safe rooms. If you returned FALSE for * people with fight timers and artifacts, that would allow * newbies to attack people with artifacts as long as they * were in safe rooms at the time! * * Note another interesting side affect is that the banner of * peace will now make you safe anywhere OTHER than safe rooms. */ if (victim->fight_timer <= 0 && !IS_ITEMAFF (victim, ITEMA_ARTIFACT)) { send_to_char ("Something in the air prevents you from attacking.\n\r", ch); return TRUE; } } if (IS_ITEMAFF (ch, ITEMA_PEACE)) { send_to_char ("You are unable to attack them.\n\r", ch); return TRUE; } // Majesty CHECK if (!IS_NPC (victim)) { CHAR_DATA *rch; for (rch = ch->in_room->people; rch; rch = rch->next_in_room) { if (IS_CLASS (rch, CLASS_FAE) && !IS_NPC (rch) && IS_SET (rch->extra2, EXTRA2_NEUTRAL) && rch->fight_timer <= 0) { send_to_char ("Something in the air prevents your from attackin.\n\r", ch); return TRUE; } } } if (IS_NPC (ch) || IS_NPC (victim)) return FALSE; if ((!CAN_PK (ch) || !CAN_PK (victim)) && ch != victim) { send_to_char ("Mortals are not permitted to fight other players.\n\r", ch); return TRUE; } if (ch != victim && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF(ch, VAM_MORTAL)) && IS_SET (ch->special, SPC_INCONNU) && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF (victim, VAM_MORTAL))) { send_to_char ("You cannot attack another vampire.\n\r", ch); return TRUE; } else if (ch != victim && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF(victim, VAM_MORTAL)) && IS_SET (victim->special, SPC_INCONNU) && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF (ch, VAM_MORTAL))) { send_to_char ("You cannot attack a member of the Inconnu.\n\r", ch); return TRUE; } return FALSE; } bool is_safe (CHAR_DATA * ch, CHAR_DATA * victim) { OBJ_DATA *obj; OBJ_DATA *obj_next; /* if (victim->fighting == ch) return FALSE; if (ch->fighting == victim) return FALSE; */ if (ch->trust > LEVEL_BUILDER && !IS_NPC(victim) && ch != victim) { send_to_char ("You cannot fight if you have implementor powers!\n\r", ch); return TRUE; } if (victim->trust > LEVEL_BUILDER && !IS_NPC(ch) && ch != victim) { send_to_char ("You cannot fight someone with implementor powers!\n\r", ch); return TRUE; } /* Ethereal people can only attack other ethereal people */ if (IS_AFFECTED (ch, AFF_ETHEREAL) && !IS_AFFECTED (victim, AFF_ETHEREAL)) { send_to_char ("You cannot while ethereal.\n\r", ch); return TRUE; } if (!IS_AFFECTED (ch, AFF_ETHEREAL) && IS_AFFECTED (victim, AFF_ETHEREAL)) { send_to_char ("You cannot fight an ethereal person.\n\r", ch); return TRUE; } /* You cannot attack across planes */ if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && !IS_AFFECTED (victim, AFF_SHADOWPLANE)) { act ("You are too insubstantial!", ch, NULL, victim, TO_CHAR); return TRUE; } if (!IS_AFFECTED (ch, AFF_SHADOWPLANE) && IS_AFFECTED (victim, AFF_SHADOWPLANE)) { act ("$E is too insubstantial!", ch, NULL, victim, TO_CHAR); return TRUE; } if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && !IS_AFFECTED (victim, AFF_SHADOWPLANE)) { act ("You are too insubstantial!", ch, NULL, victim, TO_CHAR); return TRUE; } if (!IS_AFFECTED (ch, AFF_SHADOWPLANE) && IS_AFFECTED (victim, AFF_SHADOWPLANE)) { act ("$E is too insubstantial!", ch, NULL, victim, TO_CHAR); return TRUE; } if (IS_NPC (victim) && IS_SET (victim->act, ACT_NO_KILL)) { stc ("You are unable to attack them!\n\r", ch); return TRUE; } if (IS_NPC (victim) && (victim->pIndexData->vnum == 3145)) { stc ("You are unable to attack them!\n\r", ch); return TRUE; } if (IS_SET (victim->more, MORE_JAIL)) { stc ("They are in Jail\n\r", ch); return TRUE; } if (IS_SET (ch->tag_flags, TAG_PLAYING) || IS_SET (victim->tag_flags, TAG_PLAYING)) { stc ("Not during a game of Freeze Tag!\n\r", ch); return TRUE; } if (IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING)) { stc ("You cannot interfere with wars!\n\r", ch); return TRUE; } if ((IS_SET (ch->flag2, AFF2_INARENA) && !IS_SET (victim->flag2, AFF2_INARENA)) || (IS_SET (victim->flag2, AFF2_INARENA) && !IS_SET (ch->flag2, AFF2_INARENA))) { send_to_char ("You cannot interfere with arena battles\n\r", ch); return TRUE; } if (WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS) && IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS) ) REMOVE_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (WORN_ARTIFACT (victim, ARTI_HEART_OF_DARKNESS) && IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS) ) REMOVE_BIT(victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS (ch, CLASS_DROW) && IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS (victim, CLASS_DROW) && IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS(ch, CLASS_FAE) && IS_KITH (ch, KITH_SLUAGH) && IS_SET(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS(victim, CLASS_FAE) && IS_KITH (victim, KITH_SLUAGH) && IS_SET(victim->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (ch->flag2, AFF2_INARENA) && IS_SET(victim->flag2, AFF2_INARENA)) return FALSE; else if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (ch->war, WARRING) && IS_SET (victim->war, WARRING)) return FALSE; else if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (ch->war, JOINING)) { stc ("You are unable to start hostilities just before your war!\n\r", ch); return TRUE; } else if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (victim->war, JOINING)) { stc ("You are unable to start hostilities just before their war!\n\r", ch); return TRUE; } if (!IS_NPC(victim) && !victim->desc && victim->pcdata->login_timer > 0 && victim->fight_timer < 1 && ( victim != ch ) && !IS_NPC(ch) ) { stc("Not with a login timer!\n\r", ch); return TRUE; } /* if (!IS_NPC(victim) && (victim->pcdata->login_timer > 0) && ( victim != ch ) && !IS_NPC(ch) ) { stc("Not with a login timer!\n\r", ch); return TRUE; } if (!IS_NPC(ch) && (ch->pcdata->login_timer > 0) && ( victim != ch )&& !IS_NPC(victim) ) { stc("Not with a login timer!\n\r", ch); return TRUE; } */ if (!IS_NPC(victim) && (victim->pcdata->pkill_timer > 0) && ( victim != ch ) && !IS_NPC(ch) ) { stc("You are unable to attack them as they have a Safe Timer!\n\r", ch); return TRUE; } if (!IS_NPC(ch) && (ch->pcdata->pkill_timer > 0) && ( victim != ch )&& !IS_NPC(victim) ) { stc("You are unable to attack them with a Safe Timer!\n\r", ch); return TRUE; } if (!IS_NPC (victim) && IS_SET (ch->extra2, NHELPER) && (victim != ch)) { if (IS_SET (ch->flag2, AFF2_INARENA) && (IS_SET (victim->flag2, AFF2_INARENA))) { // do nothing } else if (IS_SET (victim->war, WARRING) && IS_SET (ch->war, WARRING)) { // do nothing } else { stc ("You are unable to attack them!\n\r", ch); return TRUE; } } if (!IS_NPC (ch) && IS_SET (victim->extra2, NHELPER) && (victim != ch)) { if (IS_SET (ch->flag2, AFF2_INARENA) && (IS_SET (victim->flag2, AFF2_INARENA))) { // do nothing } else if (IS_SET (victim->war, WARRING) && IS_SET (ch->war, WARRING)) { // do nothing } else { stc ("You are unable to attack them!\n\r", ch); return TRUE; } } if (!IS_NPC (ch) && ch->level < 3 && !IS_NPC (victim) && (ch != victim)) { stc ("You must be an avatar to fight other avatars!\n\r", ch); return TRUE; } /* Make it so newbies cant be killed by players. */ if (!IS_NPC (victim) && (get_hours (ch) < 10) && !IS_NPC (ch) && (ch != victim) && !IS_SET (ch->extra2, PKREADY)) { stc ("You are unable to attack players untill you reach 10 hours!.\n\r", ch); return TRUE; } if (!IS_NPC (ch) && (get_hours (victim) < 10) && !IS_NPC (victim) && (ch != victim) && !IS_SET (victim->extra2, PKREADY)) { stc ("You are unable to attack newbies of under 10 hours!\n\r", ch); return TRUE; } if (!IS_NPC (victim) && !IS_NPC (ch) && (victim->level < 3) && (ch != victim)) { stc ("They must be an avatar!\n\r", ch); return TRUE; } if (!IS_NPC (victim) && nosafe) { return FALSE; } if (!IS_NPC (victim) && IS_SET (victim->newbits, NEW_NOTEWRITE)) { stc ("They are posting a note!\n\r", ch); return TRUE; } if (IS_ITEMAFF (ch, ITEMA_PEACE)) { send_to_char ("You are unable to attack them.\n\r", ch); return TRUE; } if (IS_ITEMAFF (victim, ITEMA_PEACE)) { send_to_char ("You can't seem to attack them.\n\r", ch); return TRUE; } // People with artifacts aren't safe. - Krynn for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (IS_SET (obj->quest, QUEST_ARTIFACT)) return FALSE; } /* if ( IS_SET(ch->in_room->room_flags,ROOM_SAFE) ) { send_to_char( "You cannot fight in a safe room.\n\r", ch ); return TRUE; } */ /* Deal with safe rooms (either you or they are in one) */ if (!ch || !victim) return TRUE; if (!ch->in_room || !victim->in_room) return TRUE; if (ch->in_room == NULL || victim->in_room == NULL || IS_SET (ch->in_room->room_flags, ROOM_SAFE) || IS_SET (victim->in_room->room_flags, ROOM_SAFE)) { if (IS_NPC (victim)) { stc ("Something in the air prevents you from attacking!\n\r", ch); return TRUE; } else if ( /*!IS_NPC(victim) && */ victim->fight_timer <= 0 && !IS_ITEMAFF (victim, ITEMA_ARTIFACT)) { send_to_char ("Something in the air prevents you from attacking!!\n\r", ch); return TRUE; } } if (!IS_NPC (victim)) { CHAR_DATA *rch; for (rch = ch->in_room->people; rch; rch = rch->next_in_room) { if (IS_CLASS (rch, CLASS_FAE) && !IS_NPC (rch) && IS_SET (rch->extra2, EXTRA2_NEUTRAL) && rch->fight_timer <= 0) { send_to_char ("Something in the air prevents your from attackin.\n\r", ch); return TRUE; } } } if (IS_HEAD (ch, LOST_HEAD) || IS_EXTRA (ch, EXTRA_OSWITCH)) { send_to_char ("Objects cannot fight!\n\r", ch); return TRUE; } else if (IS_HEAD (victim, LOST_HEAD) || IS_EXTRA (victim, EXTRA_OSWITCH)) { send_to_char ("You cannot attack an object.\n\r", ch); return TRUE; } if (IS_NPC (ch) || IS_NPC (victim)) return FALSE; /* Thx Josh! */ if (victim->fighting == ch) return FALSE; if (ch->fighting == victim) return FALSE; if (!IS_NPC (ch) && IS_EXTRA (ch, EXTRA_EARTHMELD)) return TRUE; if (!IS_NPC (victim) && IS_EXTRA (victim, EXTRA_EARTHMELD)) return TRUE; if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return TRUE; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return TRUE; } if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_STEELSHIELD)) { send_to_char ("You cannot attack while in Majesty.\n\r", ch); return TRUE; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_STEELSHIELD)) { send_to_char ("They are far to imposing.\n\r", ch); return TRUE; } if ((!CAN_PK (ch) || !CAN_PK (victim)) && ch != victim) { send_to_char ("Mortals are not permitted to fight other players.\n\r", ch); return TRUE; } if (ch != victim && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF(ch, VAM_MORTAL)) && IS_SET (ch->special, SPC_INCONNU) && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF (victim, VAM_MORTAL))) { send_to_char ("You cannot attack another vampire.\n\r", ch); return TRUE; } else if (ch != victim && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF(victim, VAM_MORTAL)) && IS_SET (victim->special, SPC_INCONNU) && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF (ch, VAM_MORTAL))) { send_to_char ("You cannot attack a member of the Inconnu.\n\r", ch); return TRUE; } return FALSE; } bool no_attack (CHAR_DATA * ch, CHAR_DATA * victim) { OBJ_DATA *obj; OBJ_DATA *obj_next; if (!IS_NPC (ch)) { if (ch->pcdata->obj_vnum != 0) { stc ("Objects can't fight.\n\r", ch); stc ("Objects can't fight.\n\r", victim); return TRUE; } } if (!IS_NPC (victim)) { if (victim->pcdata->obj_vnum != 0) { stc ("Objects can't fight.\n\r", ch); stc ("Objects can't fight.\n\r", victim); return TRUE; } } if (IS_NPC (victim) && IS_SET (ch->act, ACT_NO_KILL)) { stc ("You are unable to attack them!\n\r", ch); return TRUE; } /* Ethereal people can only attack other ethereal people */ if (IS_AFFECTED (ch, AFF_ETHEREAL) && !IS_AFFECTED (victim, AFF_ETHEREAL)) { send_to_char ("You cannot while ethereal.\n\r", ch); return TRUE; } if (!IS_AFFECTED (ch, AFF_ETHEREAL) && IS_AFFECTED (victim, AFF_ETHEREAL)) { send_to_char ("You cannot fight an ethereal person.\n\r", ch); return TRUE; } /* You cannot attack across planes */ if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && !IS_AFFECTED (victim, AFF_SHADOWPLANE)) { act ("You are too insubstantial!", ch, NULL, victim, TO_CHAR); return TRUE; } if (!IS_AFFECTED (ch, AFF_SHADOWPLANE) && IS_AFFECTED (victim, AFF_SHADOWPLANE)) { act ("$E is too insubstantial!", ch, NULL, victim, TO_CHAR); return TRUE; } if (WORN_ARTIFACT (ch, ARTI_HEART_OF_DARKNESS) && IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS) ) REMOVE_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (WORN_ARTIFACT (victim, ARTI_HEART_OF_DARKNESS) && IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS) ) REMOVE_BIT(victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS (ch, CLASS_DROW) && IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS (victim, CLASS_DROW) && IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS(ch, CLASS_FAE) && IS_KITH (ch, KITH_SLUAGH) && IS_SET(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); else if (IS_CLASS(victim, CLASS_FAE) && IS_KITH (victim, KITH_SLUAGH) && IS_SET(victim->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (ch->flag2, AFF2_INARENA) && IS_SET(victim->flag2, AFF2_INARENA)) return FALSE; else if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (ch->war, WARRING) && IS_SET (victim->war, WARRING)) return FALSE; else if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (ch->war, JOINING)) { stc ("You are unable to start hostilities just before your war!\n\r", ch); return TRUE; } else if (!IS_NPC(ch) && !IS_NPC(victim) && IS_SET (victim->war, JOINING)) { stc ("You are unable to start hostilities just before their war!\n\r", ch); return TRUE; } if (!IS_NPC (ch) && ch->level < 3 && !IS_NPC (victim)) { stc ("You must be an avatar to fight other avatars!\n\r", ch); return TRUE; } if (!IS_NPC (victim) && !IS_NPC (ch) && victim->level < 3) { stc ("They must be an avatar!\n\r", ch); return TRUE; } if (!IS_NPC (victim) && nosafe) { return FALSE; } /* if ( victim->fight_timer > 0 ) return FALSE; */ // People with artifacts aren't safe. - Krynn for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (IS_SET (obj->quest, QUEST_ARTIFACT)) return FALSE; } /* Old Code if ( IS_SET(ch->in_room->room_flags,ROOM_SAFE) ) { send_to_char( "You cannot fight in a safe room.\n\r", ch ); return TRUE; } */ if (!ch || !victim) return TRUE; if (ch->in_room == NULL || victim->in_room == NULL || IS_SET (ch->in_room->room_flags, ROOM_SAFE) || IS_SET (victim->in_room->room_flags, ROOM_SAFE)) { if (!IS_NPC (victim) || (victim->fight_timer <= 0 && !IS_ITEMAFF (victim, ITEMA_ARTIFACT))) { send_to_char ("Something in the air prevents you from attacking!!!\n\r", ch); return TRUE; } } if (!IS_NPC (ch) && IS_EXTRA (ch, EXTRA_EARTHMELD)) return TRUE; if (!IS_NPC (victim) && IS_EXTRA (victim, EXTRA_EARTHMELD)) return TRUE; // if (!IS_NPC(ch) && IS_AFFECTED(ch, AFF_SAFE) ) if (IS_HEAD (ch, LOST_HEAD) || IS_EXTRA (ch, EXTRA_OSWITCH)) { send_to_char ("Objects cannot fight!\n\r", ch); return TRUE; } else if (IS_HEAD (victim, LOST_HEAD) || IS_EXTRA (victim, EXTRA_OSWITCH)) { send_to_char ("You cannot attack objects.\n\r", ch); return TRUE; } if (!IS_NPC(ch) && !IS_NPC(victim) && ch != victim && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF(ch, VAM_MORTAL)) && IS_SET (ch->special, SPC_INCONNU) && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF (victim, VAM_MORTAL))) { send_to_char ("You cannot attack another vampire.\n\r", ch); return TRUE; } else if (!IS_NPC(ch) && !IS_NPC(victim) && ch != victim && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF(victim, VAM_MORTAL)) && IS_SET (victim->special, SPC_INCONNU) && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF (ch, VAM_MORTAL))) { send_to_char ("You cannot attack a member of the Inconnu.\n\r", ch); return TRUE; } return FALSE; } /* * See if an attack justifies a KILLER flag. */ void check_killer (CHAR_DATA * ch, CHAR_DATA * victim) { /* * Follow charm thread to responsible character. * Attacking someone's charmed char is hostile! */ while (IS_AFFECTED (victim, AFF_CHARM) && victim->master != NULL) victim = victim->master; /* * NPC's are fair game. * So are killers and thieves. */ if (IS_NPC (victim)) return; /* * Charm-o-rama. */ if (IS_SET (ch->affected_by, AFF_CHARM)) { if (ch->master == NULL) { affect_strip (ch, gsn_charm_person); REMOVE_BIT (ch->affected_by, AFF_CHARM); return; } stop_follower (ch); return; } return; } /* * Check for parry. */ bool check_parry (CHAR_DATA * ch, CHAR_DATA * victim, int dt) { OBJ_DATA *obj = NULL; int chance = 0; int thingy; bool fist = FALSE; bool claws = FALSE; bool hands = FALSE; if (!IS_AWAKE (victim)) return FALSE; else if (IS_CLASS (victim, CLASS_WEREWOLF) && victim->gifts[AHROUN] >= 2 && IS_VAMPAFF (victim, VAM_CLAWS) && get_eq_char (victim, WEAR_WIELD) == NULL && get_eq_char (victim, WEAR_HOLD) == NULL && get_eq_char (victim, WEAR_DUAL) == NULL) { obj = NULL; claws = TRUE; } else if (IS_CLASS (victim, CLASS_DRAGON) && get_eq_char (victim, WEAR_WIELD) == NULL && get_eq_char (victim, WEAR_HOLD) == NULL && get_eq_char (victim, WEAR_DUAL) == NULL) { obj = NULL; claws = TRUE; } else if (IS_CLASS (victim, CLASS_MONK) && IS_SET (victim->newbits, NEW_MONKADAM) && get_eq_char (victim, WEAR_WIELD) == NULL && get_eq_char (victim, WEAR_HOLD) == NULL && get_eq_char (victim, WEAR_DUAL) == NULL) { obj = NULL; hands = TRUE; } else if (IS_CLASS (victim, CLASS_NINJA) && IS_SET (victim->more, MORE_STEELFISTS) && get_eq_char (victim, WEAR_WIELD) == NULL && get_eq_char (victim, WEAR_HOLD) == NULL && get_eq_char (victim, WEAR_DUAL) == NULL) { obj = NULL; fist = TRUE; } else if (!IS_NPC(victim) && !IS_CLASS (victim, CLASS_WEREWOLF) && IS_VAMPAFF (victim, VAM_CLAWS) && get_eq_char (victim, WEAR_WIELD) == NULL && get_eq_char (victim, WEAR_HOLD) == NULL && get_eq_char (victim, WEAR_DUAL) == NULL) { obj = NULL; claws = TRUE; } else { if ((obj = get_eq_char(victim, WEAR_DUAL)) == NULL) { if ((obj = get_eq_char (victim, WEAR_WIELD)) == NULL || obj->item_type != ITEM_WEAPON) { if ((obj = get_eq_char (victim, WEAR_HOLD)) == NULL || obj->item_type != ITEM_WEAPON) if ((obj = get_eq_char (victim, WEAR_DUAL)) == NULL || obj->item_type != ITEM_WEAPON) return FALSE; } } } if (obj && dt == 1000) return FALSE; if (dt < 1000 || dt > 1012) return FALSE; if (!IS_NPC (ch)) chance -= (ch->wpn[dt - 1000] * 0.1); else chance -= (ch->level * 0.2); chance -= (char_hitroll (ch) * 0.1); if (!IS_NPC (ch)) { if (IS_CLASS (ch, CLASS_VAMPIRE)) { if (get_disc(ch, VAM_CELE) > 0) chance -= (4 * get_disc(ch, VAM_CELE)); } if (IS_CLASS (ch, CLASS_NINJA)) { if (ch->pcdata->powers[NPOWER_CHIKYU] >= 6 && ch->pcdata->powers[HARA_KIRI] > 0) chance -= 10; if (ch->pcdata->powers[NPOWER_CHIKYU] > 2) chance -= 10; if (ch->pcdata->powers[NINJAKI] > 4) chance -= (ch->pcdata->powers[NINJAKI] / 4); } if (IS_CLASS (ch, CLASS_DEMON)) { if (IS_DEMPOWER (ch, DEM_SPEED)) { if (IS_SET (ch->special, SPC_DEMON_LORD)) chance -= 30; else if (IS_SET (ch->special, SPC_PRINCE)) chance -= 25; else if (IS_SET (ch->special, SPC_SIRE)) chance -= 20; else chance -= 15; } if (!IS_SET (ch->warp, WARP_QUICKNESS)) chance -= 10; } if (IS_CLASS (ch, CLASS_FAE)) { if (IS_SET (ch->extra2, EXTRA2_FAESPEED)) chance -= 20; } if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_DRAGON)) { chance -= (GET_AGE(ch) * 2); } if (IS_CLASS (ch, CLASS_MAGE)) { if (IS_SET (ch->mflags, MAGE_POLYAPPEAR)) chance -= 15; if (ch->spheres[MTIM] > 0) chance -= (ch->spheres[MTIM] * 2); } if (IS_CLASS (ch, CLASS_DROW)) { if (IS_SET (ch->pcdata->powers[1], DPOWER_ARMS)) chance -= 20; if (IS_SET (ch->pcdata->powers[1], DPOWER_SPEED)) chance -= 20; } if ( IS_CLASS(ch, CLASS_WRAITH)) { chance -= 20; } if (IS_CLASS (ch, CLASS_WEREWOLF)) { if (IS_SET (ch->special, SPC_WOLFMAN)) chance -= 5; if (ch->gifts[SILENTSTRIDERS] > 0) chance -= 5; if (ch->gifts[SILENTSTRIDERS] > 1) chance -= 5; if (ch->gifts[SILENTSTRIDERS] > 2) chance -= 5; if (ch->gifts[STARGAZERS] > 3) chance -= 5; } if (IS_CLASS (ch, CLASS_MONK)) { if (ch->chi[CURRENT] > 0) chance -= (ch->chi[CURRENT] * 4); } if (IS_CLASS (ch, CLASS_HIGHLANDER)) { if (get_eq_char (ch, WEAR_DUAL) != NULL) chance -= ch->race * 2 / 3; } } /* Some shit for Earth Embrace )Mage Power(, works on NPC's.. */ if (IS_SET (ch->mflags, MAGE_EMBRACED2)) chance -= 10; if (IS_SET (ch->mflags, MAGE_EMBRACED1)) chance -= 5; if (!IS_NPC (victim)) chance += (victim->wpn[dt - 1000] * 0.5); else chance += victim->level; if (IS_STANCE (victim, STANCE_CRANE) && victim->stance[STANCE_CRANE] > 0 && !can_counter (ch) && !can_bypass (ch, victim)) chance += (victim->stance[STANCE_CRANE] * 0.25); else if (IS_STANCE (victim, STANCE_MANTIS) && victim->stance[STANCE_MANTIS] > 0 && !can_counter (ch) && !can_bypass (ch, victim)) chance += (victim->stance[STANCE_MANTIS] * 0.25); if (claws || hands || fist) chance += (char_hitroll (victim) * 0.075); else chance += (char_hitroll (victim) * 0.1); /* Some shit for Earth Embrace )Mage Power(, works on NPC's.. */ if (IS_SET (victim->mflags, MAGE_EMBRACED2)) chance += 10; if (IS_SET (victim->mflags, MAGE_EMBRACED1)) chance += 5; if (!IS_NPC (victim)) { if (IS_CLASS (victim, CLASS_VAMPIRE)) { if (get_disc(victim, VAM_CELE) > 0) chance += (4 * get_disc(victim, VAM_CELE)); } if (IS_CLASS (victim, CLASS_NINJA)) { if (victim->pcdata->powers[NPOWER_CHIKYU] >= 6 && victim->pcdata->powers[HARA_KIRI] > 0) chance += 10; if (victim->pcdata->powers[NPOWER_CHIKYU] > 2) chance += 10; if (victim->pcdata->powers[NINJAKI] > 4) chance += (victim->pcdata->powers[NINJAKI] / 4); } if (IS_CLASS (victim, CLASS_DEMON)) { if (IS_DEMPOWER (victim, DEM_SPEED)) { if (IS_SET (victim->special, SPC_DEMON_LORD)) chance += 30; else if (IS_SET (victim->special, SPC_PRINCE)) chance += 25; else if (IS_SET (victim->special, SPC_SIRE)) chance += 20; else chance += 15; } } if (IS_CLASS (victim, CLASS_FAE)) { if (IS_SET (victim->extra2, EXTRA2_FAESPEED)) chance += 20; } if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_DRAGON)) { chance += (GET_AGE(victim) * 2); } if (IS_CLASS (victim, CLASS_DROW)) { if (IS_SET (victim->pcdata->powers[1], DPOWER_ARMS)) chance += 10; if (IS_SET (victim->pcdata->powers[1], DPOWER_SPEED)) chance += 15; } if (IS_CLASS (victim, CLASS_MAGE)) { if (IS_SET (victim->mflags, MAGE_POLYAPPEAR)) chance += 15; if (victim->spheres[MTIM] > 0) chance += (victim->spheres[MTIM] * 2); } if (IS_CLASS (victim, CLASS_MONK)) { if (victim->chi[CURRENT] > 0) chance += (victim->chi[CURRENT] * 4); } if ( IS_CLASS(victim, CLASS_WRAITH)) { chance += 20; } if (IS_CLASS (victim, CLASS_WEREWOLF)) { if (IS_SET (victim->special, SPC_WOLFMAN)) chance += 5; if (victim->gifts[SILENTSTRIDERS] > 0) chance += 5; if (victim->gifts[SILENTSTRIDERS] > 1) chance += 5; if (victim->gifts[SILENTSTRIDERS] > 2) chance += 5; if (victim->gifts[STARGAZERS] > 3) chance += 5; } if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (get_eq_char (victim, WEAR_DUAL) != NULL) chance += ch->race * 2 / 3; } } if (!IS_NPC (ch) && get_disc(ch, VAM_CELE) > 0 && IS_CLASS (ch, CLASS_VAMPIRE)) { if (ch->pcdata->rank == AGE_METHUSELAH) chance -= 15; else if (ch->pcdata->rank == AGE_ELDER) chance -= 10; else if (ch->pcdata->rank == AGE_ANCILLA) chance -= 5; } if (!IS_NPC (victim) && get_disc(victim, VAM_CELE) > 0 && IS_CLASS (victim, CLASS_VAMPIRE)) { if (victim->pcdata->rank == AGE_METHUSELAH) chance += 15; else if (victim->pcdata->rank == AGE_ELDER) chance += 10; else if (victim->pcdata->rank == AGE_ANCILLA) chance += 5; } if (IS_NPC (victim)) { if (victim->level < 100) chance = 15; if (victim->level >= 100) chance = (victim->level * .01); if (victim->level >= 500) chance = 50; } if (IS_SUPER_NPC (ch)) chance -= ch->level / 50; if (IS_SUPER_NPC (victim)) chance += victim->level / 50; if (chance > 75) chance = 75; else if (chance < 25) chance = 25; thingy = number_range (1, 100); if (thingy >= chance) return FALSE; if (IS_SET (ch->extra2, DROW_FIGHTDANCE) && IS_CLASS (ch, CLASS_DROW) && number_percent () >= 50 && (((obj = get_eq_char (ch, WEAR_WIELD)) != NULL && (obj->value[3] == 4 || obj->value[3] == 11)) || ((obj = get_eq_char (ch, WEAR_HOLD)) != NULL && (obj->value[3] == 4 || obj->value[3] == 11)) || ((obj = get_eq_char (ch, WEAR_DUAL)) != NULL && (obj->value[3] == 4 || obj->value[3] == 11)))) { act ("$n's dark weapon dances around your defences, making a strange sound.", ch, NULL, victim, TO_VICT); act ("Your sacrificial weapon hums in the air as it dances $N's defences.", ch, obj, victim, TO_CHAR); return FALSE; } if (claws) { if (IS_NPC (victim) || !IS_SET (victim->act, PLR_BRIEF)) act ("You parry $n's blow with your claws.", ch, NULL, victim, TO_VICT); if (IS_NPC (ch) || !IS_SET (ch->act, PLR_BRIEF)) act ("$N parries your blow with $S claws.", ch, NULL, victim, TO_CHAR); return TRUE; } if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_MONK) && victim->monkblock < 150) victim->monkblock++; if (hands) { if (IS_NPC (victim) || !IS_SET (victim->act, PLR_BRIEF)) act ("You parry $n's blow with your adamantium hands.", ch, NULL, victim, TO_VICT); if (IS_NPC (ch) || !IS_SET (ch->act, PLR_BRIEF)) act ("$N parries your blow with $S adamantium hands.", ch, NULL, victim, TO_CHAR); return TRUE; } if (fist) { if (IS_NPC (victim) || !IS_SET (victim->act, PLR_BRIEF)) act ("You parry $n's blow with your iron fists.", ch, NULL, victim, TO_VICT); if (IS_NPC (ch) || !IS_SET (ch->act, PLR_BRIEF)) act ("#p$N parries your blow with $S iron fists.", ch, NULL, victim, TO_CHAR); return TRUE; } if (!IS_NPC (victim) && obj != NULL && obj->item_type == ITEM_WEAPON && obj->value[3] >= 0 && obj->value[3] <= 12) { if (IS_NPC (victim) || !IS_SET (victim->act, PLR_BRIEF)) act ("You parry $n's blow with $p.", ch, obj, victim, TO_VICT); if (IS_NPC (ch) || !IS_SET (ch->act, PLR_BRIEF)) act ("$N parries your blow with $p.", ch, obj, victim, TO_CHAR); return TRUE; } if (IS_NPC (victim) || !IS_SET (victim->act, PLR_BRIEF)) act ("You parry $n's attack.", ch, NULL, victim, TO_VICT); if (IS_NPC (ch) || !IS_SET (ch->act, PLR_BRIEF)) act ("$N parries your attack.", ch, NULL, victim, TO_CHAR); return TRUE; } /* * Check for dodge. */ bool check_dodge (CHAR_DATA * ch, CHAR_DATA * victim, int dt) { int chance = 0; int thingy; int dodge_type = number_range (1, 9); if (!IS_AWAKE (victim)) return FALSE; if (!IS_NPC (ch)) chance -= (ch->wpn[dt - 1000] * 0.1); else chance -= (ch->level * 0.2); if (!IS_NPC (victim)) chance += (victim->wpn[0] * 0.5); else chance += victim->level; if (IS_STANCE (victim, STANCE_MONGOOSE) && victim->stance[STANCE_MONGOOSE] > 0 && !can_counter (ch) && !can_bypass (ch, victim)) (chance += victim->stance[STANCE_MONGOOSE] * 0.25); if (IS_STANCE (victim, STANCE_SWALLOW) && victim->stance[STANCE_SWALLOW] > 0 && !can_counter (ch) && !can_bypass (ch, victim)) (chance += victim->stance[STANCE_SWALLOW] * 0.25); if (!IS_NPC (ch)) { if (IS_CLASS (ch, CLASS_VAMPIRE)) { if (get_disc(ch, VAM_CELE) > 0) chance -= (5 * get_disc(ch, VAM_CELE)); } if (IS_CLASS (ch, CLASS_NINJA)) { if (ch->pcdata->powers[NPOWER_CHIKYU] >= 6 && ch->pcdata->powers[HARA_KIRI] > 0) chance -= 25; if (ch->pcdata->powers[NPOWER_CHIKYU] > 2) chance -= 20; if (ch->pcdata->powers[NINJAKI] > 4) chance -= (ch->pcdata->powers[NINJAKI] / 4); } if (IS_CLASS (ch, CLASS_DEMON)) { if (!IS_SET (ch->warp, WARP_QUICKNESS)) chance -= 10; if (IS_DEMPOWER (ch, DEM_SPEED)) { if (IS_SET (ch->special, SPC_DEMON_LORD)) chance -= 30; else if (IS_SET (ch->special, SPC_DEMON_LORD)) chance -= 25; else if (IS_SET (ch->special, SPC_SIRE)) chance -= 20; else chance -= 15; } } if (IS_CLASS (ch, CLASS_FAE)) { if (IS_SET (ch->extra2, EXTRA2_FAESPEED)) chance -= 30; } if (IS_CLASS (ch, CLASS_MAGE)) { if (IS_SET (ch->mflags, MAGE_POLYAPPEAR)) chance -= 15; if (ch->spheres[MTIM] > 0) chance -= (ch->spheres[MTIM] * 2); } if (IS_CLASS (ch, CLASS_DROW)) { if (IS_SET (ch->pcdata->powers[1], DPOWER_ARMS)) chance -= 40; } if ( IS_CLASS(ch, CLASS_WRAITH)) { chance -= 30; } if (IS_CLASS (ch, CLASS_WEREWOLF)) { if (IS_SET (ch->special, SPC_WOLFMAN)) chance -= 5; if (ch->gifts[SILENTSTRIDERS] > 0) chance -= 5; if (ch->gifts[SILENTSTRIDERS] > 1) chance -= 10; if (ch->gifts[SILENTSTRIDERS] > 2) chance -= 10; if (ch->gifts[STARGAZERS] > 3) chance -= 5; } if (IS_CLASS (ch, CLASS_MONK)) { if (ch->chi[CURRENT] > 0) chance -= (ch->chi[CURRENT] * 7); } if (IS_CLASS (ch, CLASS_HIGHLANDER)) { if (get_eq_char (ch, WEAR_DUAL) != NULL) chance -= ch->race * 2 / 3; } } /* Some shit for Earth Embrace )Mage Power(, works on NPC's.. */ if (IS_SET (victim->mflags, MAGE_EMBRACED2)) chance += 10; if (IS_SET (victim->mflags, MAGE_EMBRACED1)) chance += 5; if (IS_SET (ch->mflags, MAGE_EMBRACED2)) chance -= 10; if (IS_SET (ch->mflags, MAGE_EMBRACED1)) chance -= 5; if (IS_SUPER_NPC (ch)) chance -= ch->level / 100; if (IS_SUPER_NPC (victim)) chance += ch->level / 100; if (!IS_NPC (victim)) { if (IS_CLASS (victim, CLASS_VAMPIRE)) { if (get_disc(victim, VAM_CELE) > 0) chance += (5 * get_disc(victim, VAM_CELE)); } if (IS_CLASS (victim, CLASS_NINJA)) { if (victim->pcdata->powers[NPOWER_CHIKYU] >= 6 && victim->pcdata->powers[HARA_KIRI] > 0) chance += 25; if (victim->pcdata->powers[NPOWER_CHIKYU] > 2) chance += 20; if (victim->pcdata->powers[NINJAKI] > 4) chance += (victim->pcdata->powers[NINJAKI] / 4); } if (IS_CLASS (victim, CLASS_DEMON)) { if (IS_SET (victim->warp, WARP_QUICKNESS)) chance += 10; if (IS_DEMPOWER (victim, DEM_SPEED)) { if (IS_SET (victim->special, SPC_DEMON_LORD)) chance += 30; else if (IS_SET (victim->special, SPC_PRINCE)) chance += 25; else if (IS_SET (victim->special, SPC_SIRE)) chance += 20; else chance += 15; } } if (IS_CLASS (victim, CLASS_FAE)) { if (IS_SET (victim->extra2, EXTRA2_FAESPEED)) chance += 30; } if (IS_CLASS (victim, CLASS_DROW)) { if (IS_SET (victim->pcdata->powers[1], DPOWER_ARMS)) chance += 40; } if (IS_CLASS (victim, CLASS_MAGE)) { if (IS_SET (victim->mflags, MAGE_POLYAPPEAR)) chance += 15; if (victim->spheres[MTIM] > 0) chance += (victim->spheres[MTIM] * 2); } if (IS_CLASS (victim, CLASS_MONK)) { if (victim->chi[CURRENT] > 0) chance += (victim->chi[CURRENT] * 7); } if ( IS_CLASS(victim, CLASS_WRAITH)) { chance += 30; } if (IS_CLASS (victim, CLASS_WEREWOLF)) { if (IS_SET (victim->special, SPC_WOLFMAN)) chance += 5; if (victim->gifts[SILENTSTRIDERS] > 0) chance += 5; if (victim->gifts[SILENTSTRIDERS] > 1) chance += 10; if (victim->gifts[SILENTSTRIDERS] > 2) chance += 10; if (victim->gifts[STARGAZERS] > 3) chance += 5; } if (IS_CLASS (victim, CLASS_HIGHLANDER)) { if (get_eq_char (victim, WEAR_DUAL) != NULL) chance += ch->race * 2 / 3; } } if (IS_SUPER_NPC (ch)) chance -= ch->level / 100; if (IS_SUPER_NPC (victim)) chance += ch->level / 100; if (!IS_NPC (ch) && IS_VAMPAFF (ch, VAM_CELERITY) && IS_CLASS (ch, CLASS_VAMPIRE)) { if (ch->pcdata->rank == AGE_METHUSELAH) chance -= 20; else if (ch->pcdata->rank == AGE_ELDER) chance -= 15; else if (ch->pcdata->rank == AGE_ANCILLA) chance -= 10; } if (!IS_NPC (victim) && IS_VAMPAFF (victim, VAM_CELERITY) && IS_CLASS (victim, CLASS_VAMPIRE)) { if (victim->pcdata->rank == AGE_METHUSELAH) chance += 20; else if (victim->pcdata->rank == AGE_ELDER) chance += 15; else if (victim->pcdata->rank == AGE_ANCILLA) chance += 10; } if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_MONK) && (victim->monkblock / 4 > 0)) chance += (victim->monkblock / 4); if (chance > 75) chance = 75; else if (chance < 25) chance = 25; if (IS_NPC (victim)) { if (victim->level < 100) chance = 15; if (victim->level >= 100) chance = (victim->level * .01); if (victim->level >= 500) chance = 50; } thingy = number_range (1, 100); if (thingy >= chance) return FALSE; if (IS_POLYAFF (victim, POLY_BAT) || IS_POLYAFF (victim, POLY_SERPENT)) dodge_type = 0; if (IS_NPC (victim) || !IS_SET (victim->act, PLR_BRIEF)) { switch (dodge_type) { default: act ("You dodge $n's blow.", ch, NULL, victim, TO_VICT); break; case 1: act ("You duck under $n's blow.", ch, NULL, victim, TO_VICT); break; case 2: case 3: case 4: case 5: case 6: act ("You sidestep $n's blow.", ch, NULL, victim, TO_VICT); break; case 7: act ("You jump over $n's blow.", ch, NULL, victim, TO_VICT); break; case 8: act ("You leap out of the way of $n's blow.", ch, NULL, victim, TO_VICT); break; case 9: act ("You roll under $n's blow.", ch, NULL, victim, TO_VICT); break; } } if (IS_NPC (ch) || !IS_SET (ch->act, PLR_BRIEF)) { switch (dodge_type) { default: act ("$N dodges your blow.", ch, NULL, victim, TO_CHAR); break; case 1: act ("$N ducks under your blow.", ch, NULL, victim, TO_CHAR); break; case 2: case 3: case 4: case 5: case 6: act ("$N sidesteps your blow.", ch, NULL, victim, TO_CHAR); break; case 7: act ("$N jumps over your blow.", ch, NULL, victim, TO_CHAR); break; case 8: act ("$N leaps out of the way of your blow.", ch, NULL, victim, TO_CHAR); break; case 9: act ("$N rolls under your blow.", ch, NULL, victim, TO_CHAR); break; } } return TRUE; } /* * Set position of a victim. */ void update_pos (CHAR_DATA * victim) { CHAR_DATA *mount; if (victim->hit > 0) { if (victim->position <= POS_STUNNED) { bool gm_stance = FALSE; victim->position = POS_STANDING; if (!IS_NPC (victim) && victim->stance[0] > 0) { int stance = victim->stance[0]; if (victim->stance[stance] >= 200) gm_stance = TRUE; } if (IS_NPC (victim) || victim->max_hit * 0.25 > victim->hit || !gm_stance) { act ("$n clambers back to $s feet.", victim, NULL, NULL, TO_ROOM); act ("You clamber back to your feet.", victim, NULL, NULL, TO_CHAR); } else { act ("$n flips back up to $s feet.", victim, NULL, NULL, TO_ROOM); act ("You flip back up to your feet.", victim, NULL, NULL, TO_CHAR); } } return; } else if ((mount = victim->mount) != NULL) { if (victim->mounted == IS_MOUNT) { act ("$n rolls off $N.", mount, NULL, victim, TO_ROOM); act ("You roll off $N.", mount, NULL, victim, TO_CHAR); } else if (victim->mounted == IS_RIDING) { act ("$n falls off $N.", victim, NULL, mount, TO_ROOM); act ("You fall off $N.", victim, NULL, mount, TO_CHAR); } mount->mount = NULL; victim->mount = NULL; mount->mounted = IS_ON_FOOT; victim->mounted = IS_ON_FOOT; } if (!IS_NPC (victim) && victim->hit <= -11 && IS_HERO (victim)) { victim->hit = -10; if (victim->position == POS_FIGHTING) stop_fighting (victim, TRUE); return; } if (IS_NPC (victim) || victim->hit <= -11) { victim->position = POS_DEAD; return; } if (victim->hit <= -6) victim->position = POS_MORTAL; else if (victim->hit <= -3) victim->position = POS_INCAP; else victim->position = POS_STUNNED; return; } /* * Start fights. */ void set_fighting (CHAR_DATA * ch, CHAR_DATA * victim) { if (ch->fighting != NULL) { //bug( "Set_fighting: already fighting", 0 ); return; } if (!IS_NPC (ch) && IS_AFFECTED(ch, AFF_ETHEREAL) ) { REMOVE_BIT(ch->affected_by, AFF_ETHEREAL); stc("You fade into the real world!\n\r", ch); //return; } if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_STEELSHIELD)) { REMOVE_BIT (ch->affected_by, AFF_STEELSHIELD); stc ("You lower your majesty.\n\r", ch); //return; } if (!IS_NPC (ch) && IS_ITEMAFF (ch, ITEMA_PEACE)) REMOVE_BIT(ch->itemaffect, ITEMA_PEACE); /* Drow Darkness vanishes on fight start * MAC 11/12/99 */ if (IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS) ) REMOVE_BIT(ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (!IS_NPC (victim) && (IS_CLASS (ch, CLASS_DROW) || (IS_CLASS(ch, CLASS_FAE) && IS_KITH (ch, KITH_SLUAGH))) && IS_SET (ch->newbits, NEW_DARKNESS)) { REMOVE_BIT (ch->newbits, NEW_DARKNESS); if ((ch->in_room != NULL) && IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); send_to_char ("Your darkness fades away.\n\r", ch); } if (!IS_NPC (ch) && !IS_NPC (victim)) ch->fight_timer = 30; if (!IS_NPC (victim) && !IS_NPC (ch)) victim->fight_timer = 30; if (IS_AFFECTED (ch, AFF_SLEEP)) affect_strip (ch, gsn_sleep); ch->damcap[DAM_CHANGE] = 1; if (ch->in_room != victim->in_room) return; ch->fighting = victim; ch->position = POS_FIGHTING; autodrop (ch); autodrop (victim); return; } void stop_embrace (CHAR_DATA * ch, CHAR_DATA * victim) { if (victim == NULL) { ch->embracing = NULL; return; } victim->embraced = NULL; ch->embracing = NULL; return; } /* * Stop fights. */ void stop_fighting (CHAR_DATA * ch, bool fBoth) { CHAR_DATA *fch; for (fch = char_list; fch != NULL; fch = fch->next) { if (fch->fighting == NULL && fch->position != POS_FIGHTING) continue; if (fch == ch || (fBoth && fch->fighting && fch->fighting == ch)) { fch->fighting = NULL; fch->position = POS_STANDING; update_pos (fch); } } return; } /* * Make a corpse out of a character. */ OBJ_DATA *make_corpse (CHAR_DATA * ch) { char buf[MAX_STRING_LENGTH]; OBJ_DATA *corpse; OBJ_DATA *obj; OBJ_DATA *obj_next; char *name; if (IS_NPC (ch)) { if (ch->pIndexData->vnum == 25) { for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; extract_obj (obj); } do_say(ch, "This area has become too dangerous..."); do_say(ch, "Time to move on."); act ("You heft your backpack over your shoulder and wander out of the room.", ch, NULL, NULL, TO_CHAR); act ("$n hefts $s backpack over $s shoulder and wanders out of the room.", ch, NULL, NULL, TO_ROOM); load_oaka(TRUE); return NULL; } name = ch->short_descr; corpse = create_object (get_obj_index (OBJ_VNUM_CORPSE_NPC), 0); corpse->timer = number_range (60, 120); corpse->value[2] = ch->pIndexData->vnum; if (ch->gold > 0) { obj_to_obj (create_money (ch->gold), corpse); ch->gold = 0; } } else { name = ch->name; corpse = create_object (get_obj_index (OBJ_VNUM_CORPSE_PC), 0); corpse->timer = number_range (600, 1200); /* Why should players keep their gold? */ if (ch->gold > 0) { obj = create_money (ch->gold); if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && (!IS_SET (obj->extra_flags, ITEM_SHADOWPLANE))) SET_BIT (obj->extra_flags, ITEM_SHADOWPLANE); obj_to_obj (obj, corpse); ch->gold = 0; } } sprintf (buf, corpse->short_descr, name); free_string (corpse->short_descr); corpse->short_descr = str_dup (buf); sprintf (buf, corpse->description, name); free_string (corpse->description); corpse->description = str_dup (buf); for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; obj_from_char (obj); if (IS_SET (obj->extra_flags, ITEM_VANISH)) extract_obj (obj); else if (IS_SET (obj->quest, QUEST_ARTIFACT) || obj->item_type == ITEM_PIECE || obj->item_type == ITEM_STOKEN) { if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && (!IS_SET (obj->extra_flags, ITEM_SHADOWPLANE))) SET_BIT (obj->extra_flags, ITEM_SHADOWPLANE); if (IS_ARTIFACT(obj, ARTI_LIONS_MANE) && IS_SET(ch->more, MORE_LIONSMANE)) do_pull(ch, obj->name); act ("$p rolls off your corpse.", ch, obj, NULL, TO_CHAR); act ("$p rolls off $P.", ch, obj, corpse, TO_ROOM); obj_to_room (obj, ch->in_room); } else if (obj->questowner != NULL && strlen (obj->questowner) > 1) { if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && (!IS_SET (obj->extra_flags, ITEM_SHADOWPLANE))) SET_BIT (obj->extra_flags, ITEM_SHADOWPLANE); act ("$p rolls off your corpse.", ch, obj, NULL, TO_CHAR); act ("$p rolls off $P.", ch, obj, corpse, TO_ROOM); obj_to_room (obj, ch->in_room); } else if (obj->item_type == ITEM_NEWTOKEN) { if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && (!IS_SET (obj->extra_flags, ITEM_SHADOWPLANE))) SET_BIT (obj->extra_flags, ITEM_SHADOWPLANE); act ("$p rolls off your corpse.", ch, obj, NULL, TO_CHAR); act ("$p rolls off $P.", ch, obj, corpse, TO_ROOM); obj_to_room (obj, ch->in_room); } else if (obj->item_type == ITEM_QPRIZE) { if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && (!IS_SET (obj->extra_flags, ITEM_SHADOWPLANE))) SET_BIT (obj->extra_flags, ITEM_SHADOWPLANE); act ("$p rolls off your corpse.", ch, obj, NULL, TO_CHAR); act ("$p rolls off $P.", ch, obj, corpse, TO_ROOM); obj_to_room (obj, ch->in_room); } else { if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && (!IS_SET (obj->extra_flags, ITEM_SHADOWPLANE))) SET_BIT (obj->extra_flags, ITEM_SHADOWPLANE); obj_to_obj (obj, corpse); } } /* If you die in the shadowplane, your corpse should stay there */ if (IS_AFFECTED (ch, AFF_SHADOWPLANE)) SET_BIT (corpse->extra_flags, ITEM_SHADOWPLANE); obj_to_room (corpse, ch->in_room); return corpse; } void death_cry (CHAR_DATA * ch) { ROOM_INDEX_DATA *was_in_room; char *msg; int door; if (IS_SET (ch->more, MORE_MESSAGE)) { if (IS_NPC (ch)) msg = "You hear something's death cry."; else msg = "You hear someone's death cry."; was_in_room = ch->in_room; for (door = 0; door <= 5; door++) { EXIT_DATA *pexit; if ((pexit = was_in_room->exit[door]) != NULL && pexit->to_room != NULL && pexit->to_room != was_in_room) { ch->in_room = pexit->to_room; act (msg, ch, NULL, NULL, TO_ROOM); } } ch->in_room = was_in_room; } return; } void make_part (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; int vnum; argument = one_argument (argument, arg); vnum = 0; if (arg[0] == '\0') return; /* Is the player in a room? */ if (ch->in_room == NULL) return; if (!str_cmp (arg, "head")) vnum = OBJ_VNUM_SEVERED_HEAD; else if (!str_cmp (arg, "arm")) vnum = OBJ_VNUM_SLICED_ARM; else if (!str_cmp (arg, "leg")) vnum = OBJ_VNUM_SLICED_LEG; else if (!str_cmp (arg, "heart")) vnum = OBJ_VNUM_TORN_HEART; else if (!str_cmp (arg, "turd")) vnum = OBJ_VNUM_TORN_HEART; else if (!str_cmp (arg, "entrails")) vnum = OBJ_VNUM_SPILLED_ENTRAILS; else if (!str_cmp (arg, "brain")) vnum = OBJ_VNUM_QUIVERING_BRAIN; else if (!str_cmp (arg, "eyeball")) vnum = OBJ_VNUM_SQUIDGY_EYEBALL; else if (!str_cmp (arg, "blood")) vnum = OBJ_VNUM_SPILT_BLOOD; else if (!str_cmp (arg, "face")) vnum = OBJ_VNUM_RIPPED_FACE; else if (!str_cmp (arg, "windpipe")) vnum = OBJ_VNUM_TORN_WINDPIPE; else if (!str_cmp (arg, "cracked_head")) vnum = OBJ_VNUM_CRACKED_HEAD; else if (!str_cmp (arg, "ear")) vnum = OBJ_VNUM_SLICED_EAR; else if (!str_cmp (arg, "nose")) vnum = OBJ_VNUM_SLICED_NOSE; else if (!str_cmp (arg, "tooth")) vnum = OBJ_VNUM_KNOCKED_TOOTH; else if (!str_cmp (arg, "tongue")) vnum = OBJ_VNUM_TORN_TONGUE; else if (!str_cmp (arg, "hand")) vnum = OBJ_VNUM_SEVERED_HAND; else if (!str_cmp (arg, "foot")) vnum = OBJ_VNUM_SEVERED_FOOT; else if (!str_cmp (arg, "thumb")) vnum = OBJ_VNUM_SEVERED_THUMB; else if (!str_cmp (arg, "index")) vnum = OBJ_VNUM_SEVERED_INDEX; else if (!str_cmp (arg, "middle")) vnum = OBJ_VNUM_SEVERED_MIDDLE; else if (!str_cmp (arg, "ring")) vnum = OBJ_VNUM_SEVERED_RING; else if (!str_cmp (arg, "little")) vnum = OBJ_VNUM_SEVERED_LITTLE; else if (!str_cmp (arg, "toe")) vnum = OBJ_VNUM_SEVERED_TOE; if (vnum != 0) { char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; char *name; name = IS_NPC (ch) ? ch->short_descr : ch->name; obj = create_object (get_obj_index (vnum), 0); if (IS_NPC (ch)) obj->timer = number_range (2, 5); else obj->timer = -1; if (!str_cmp (arg, "head") && IS_NPC (ch)) obj->value[1] = ch->pIndexData->vnum; else if (!str_cmp (arg, "head") && !IS_NPC (ch)) { ch->pcdata->chobj = obj; obj->chobj = ch; obj->timer = number_range (2, 3); } else if (!str_cmp (arg, "arm")) SET_BIT (obj->extra_flags, ITEM_ARM); else if (!str_cmp (arg, "brain") && !IS_NPC (ch) && IS_AFFECTED (ch, AFF_POLYMORPH) && IS_HEAD (ch, LOST_HEAD)) { if (ch->pcdata->chobj != NULL) ch->pcdata->chobj->chobj = NULL; ch->pcdata->chobj = obj; obj->chobj = ch; obj->timer = number_range (2, 3); } /* For blood :) KaVir */ if (vnum == OBJ_VNUM_SPILT_BLOOD) obj->timer = 2; /* For voodoo dolls - KaVir */ if (!IS_NPC (ch)) { sprintf (buf, obj->name, name); free_string (obj->name); obj->name = str_dup (buf); } else { sprintf (buf, obj->name, "mob"); free_string (obj->name); obj->name = str_dup (buf); } sprintf (buf, obj->short_descr, name); free_string (obj->short_descr); obj->short_descr = str_dup (buf); sprintf (buf, obj->description, name); free_string (obj->description); obj->description = str_dup (buf); if (IS_AFFECTED (ch, AFF_SHADOWPLANE)) SET_BIT (obj->extra_flags, ITEM_SHADOWPLANE); obj_to_room (obj, ch->in_room); } return; } void raw_kill (CHAR_DATA * victim, CHAR_DATA * ch) { CHAR_DATA *mount; char buf[MSL]; stop_fighting (victim, TRUE); if (IS_NPC(victim) && !IS_NPC(ch)) ch->mkill++; if (!IS_NPC(victim) && IS_NPC(ch)) victim->mdeath++; if (!IS_NPC (victim) && victim->form > 0) death_message (ch, victim); death_cry (victim); mmake_corpse (victim); if (victim == quest_target) quest_target = NULL; if (victim == quest_mob) { sprintf (buf, "Oh well, I guess the quest is over, since I am about to DIE!!!!!"); do_qtalk (victim, buf); quest_mob = NULL; } if ((mount = victim->mount) != NULL) { if (victim->mounted == IS_MOUNT) { act ("$n rolls off the corpse of $N.", mount, NULL, victim, TO_ROOM); act ("You roll off the corpse of $N.", mount, NULL, victim, TO_CHAR); } else if (victim->mounted == IS_RIDING) { act ("$n falls off $N.", victim, NULL, mount, TO_ROOM); act ("You fall off $N.", victim, NULL, mount, TO_CHAR); } mount->mount = NULL; victim->mount = NULL; mount->mounted = IS_ON_FOOT; victim->mounted = IS_ON_FOOT; } if (IS_NPC (victim)) { victim->pIndexData->killed++; mobs_killed++; kill_table[URANGE (0, victim->level, MAX_LEVEL - 1)].killed++; extract_char (victim, TRUE, FALSE); return; } extract_char (victim, FALSE, FALSE); while (victim->affected) affect_remove (victim, victim->affected); if (IS_AFFECTED (victim, AFF_POLYMORPH) && IS_AFFECTED (victim, AFF_ETHEREAL)) { victim->affected_by = AFF_POLYMORPH + AFF_ETHEREAL; } else if (IS_AFFECTED (victim, AFF_POLYMORPH)) victim->affected_by = AFF_POLYMORPH; else if (IS_AFFECTED (victim, AFF_ETHEREAL)) victim->affected_by = AFF_ETHEREAL; else victim->affected_by = 0; REMOVE_BIT (victim->immune, IMM_STAKE); REMOVE_BIT (victim->extra, TIED_UP); REMOVE_BIT (victim->extra, GAGGED); REMOVE_BIT (victim->extra, BLINDFOLDED); REMOVE_BIT (victim->extra, EXTRA_PREGNANT); REMOVE_BIT (victim->extra, EXTRA_LABOUR); REMOVE_BIT (victim->newbits, NEW_CALM); victim->pcdata->stats[DEMON_POWER] = 0; victim->disquiet_counter = 0; victim->itemaffect = 0; victim->loc_hp[0] = 0; victim->loc_hp[1] = 0; victim->loc_hp[2] = 0; victim->loc_hp[3] = 0; victim->loc_hp[4] = 0; victim->loc_hp[5] = 0; victim->loc_hp[6] = 0; victim->armor = 100; victim->position = POS_RESTING; victim->hit = UMAX (1, victim->hit); victim->mana = UMAX (1, victim->mana); victim->move = UMAX (1, victim->move); victim->hitroll = 0; victim->damroll = 0; victim->saving_throw = 0; victim->carry_weight = 0; victim->carry_number = 0; victim->specxtype = 0; do_call (victim, "bags"); do_call (victim, "all"); save_char_obj (victim); return; } void decaptot() { extern int nosafecount; extern int decaps; char buf[MSL]; decaps++; if (decaps % 100 == 10) { do_tokenquest(NULL,"50"); return; } else if (decaps % 100 == 20) { do_stoken(NULL, "10"); return; } else if (decaps % 100 == 30) { rparasite (); return; } else if (decaps % 100 == 40) { if (nosafe) return; do_info (NULL, "Safe rooms have been removed for #w15 Minutes#n"); nosafecount = 15 * 60; nosafe = TRUE; return; } else if (decaps % 100 == 50) { do_info (NULL, "The mud has reached enough decaps to lower the time till the next MOD."); WizConfig->modtimer = WizConfig->modtimer / 2; return; } else if (decaps % 100 == 60) { WizConfig->paradoxlimit += number_range(1,10); sprintf(buf,"The mud has received 60 total decaps this boot, rasing the status window."); do_info(NULL,buf); sprintf(buf,"The new status window is %d",WizConfig->paradoxlimit); do_info(NULL,buf); return; } else if (decaps % 100 == 0) { do_info(NULL,"Congratulations, the mud has received 100 total decaps. JACKPOT TIME!"); do_tokenquest(NULL,"50"); do_stoken(NULL,"25"); rparasite (); if (!nosafe) return; do_info (NULL, "Safe rooms have been removed for #w15 Minutes#n"); nosafecount = 15 * 60; nosafe = TRUE; WizConfig->paradoxlimit += number_range(1,10); sprintf(buf,"The new status window is %d",WizConfig->paradoxlimit); do_info(NULL,buf); if (WizConfig->xptimer == 0) { sprintf (buf, "A 3x Experience Multiplier is now ON!"); do_info (NULL, buf); WizConfig->xpbonus = 3; WizConfig->xptimer = 20; save_wizconfig (); } if (WizConfig->qptimer == 0) { sprintf (buf, "A 3x Quest Point Multiplier is now ON!"); do_info (NULL, buf); WizConfig->qpbonus = 3; WizConfig->qptimer = 20; save_wizconfig (); } return; } } void behead (CHAR_DATA * victim) { char buf[MAX_STRING_LENGTH]; ROOM_INDEX_DATA *location; if (IS_NPC (victim)) return; SET_BIT (victim->loc_hp[0], LOST_HEAD); location = victim->in_room; stop_fighting (victim, TRUE); mmake_corpse (victim); extract_char (victim, FALSE, FALSE); char_from_room (victim); char_to_room (victim, location); if (victim == NULL) { bug ("Behead: Victim no longer exists.", 0); return; } make_part (victim, "head"); while (victim->affected) affect_remove (victim, victim->affected); if (IS_AFFECTED (victim, AFF_POLYMORPH) && IS_AFFECTED (victim, AFF_ETHEREAL)) { victim->affected_by = AFF_POLYMORPH + AFF_ETHEREAL; } else if (IS_AFFECTED (victim, AFF_POLYMORPH)) victim->affected_by = AFF_POLYMORPH; else if (IS_AFFECTED (victim, AFF_ETHEREAL)) victim->affected_by = AFF_ETHEREAL; else victim->affected_by = 0; if (IS_SET (victim->extra2, EXTRA2_INFECTED)) { REMOVE_BIT (victim->extra2, EXTRA2_INFECTED); SET_BIT (victim->extra2, EXTRA2_VACCINATED); mal_info.parasite_timer = 1; act ("The Parasite has fled $n's body.", victim, NULL, NULL, TO_ROOM); stc ("The Parasite has fled your body.", victim); update_parasite (); } REMOVE_BIT (victim->immune, IMM_STAKE); REMOVE_BIT (victim->extra, TIED_UP); REMOVE_BIT (victim->extra, GAGGED); REMOVE_BIT (victim->extra, BLINDFOLDED); REMOVE_BIT (victim->extra, EXTRA_PREGNANT); REMOVE_BIT (victim->extra, EXTRA_LABOUR); REMOVE_BIT (victim->newbits, NEW_CALM); victim->disquiet_counter = 0; victim->pcdata->stats[DEMON_POWER] = 0; if (IS_SET (victim->garou1, GAROU_WHELP1)) victim->max_hit = victim->max_hit + 1500; REMOVE_BIT (victim->garou1, GAROU_WHELP1); if (IS_SET (victim->garou1, GAROU_WHELP2)) victim->max_hit = victim->max_hit + 1500; REMOVE_BIT (victim->garou1, GAROU_WHELP2); victim->itemaffect = 0; victim->loc_hp[0] = 0; victim->loc_hp[1] = 0; victim->loc_hp[2] = 0; victim->loc_hp[3] = 0; victim->loc_hp[4] = 0; victim->loc_hp[5] = 0; victim->loc_hp[6] = 0; victim->affected_by = 0; victim->armor = 100; victim->position = POS_STANDING; victim->hit = 1; victim->mana = UMAX (1, victim->mana); victim->move = UMAX (1, victim->move); victim->hitroll = 0; victim->damroll = 0; victim->saving_throw = 0; victim->carry_weight = 0; victim->carry_number = 0; victim->fight_timer = 0; victim->specxtype = 0; if (victim->lstatus == 10 || victim->race > 0) { victim->captimer = 120; } SET_BIT (victim->loc_hp[0], LOST_HEAD); SET_BIT (victim->affected_by, AFF_POLYMORPH); sprintf (buf, "the severed head of %s", victim->name); free_string (victim->morph); victim->morph = str_dup (buf); do_call (victim, "all"); save_char_obj (victim); decaptot(); return; } void group_gain (CHAR_DATA * ch, CHAR_DATA * victim) { // char buf[MAX_STRING_LENGTH]; CHAR_DATA *gch; CHAR_DATA *lch; CHAR_DATA *mount; int xp; int members; /* * Monsters don't get kill xp's or alignment changes. * P-killing doesn't help either. * Dying of mortal wounds or poison doesn't give xp to anyone! */ if ((IS_NPC (ch) && (mount = ch->mount) == NULL) || victim == ch) return; if (IS_SET (ch->extra2, NHELPER)) return; members = 0; for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) { if (is_same_group (gch, ch)) members++; } if (members == 0) { bug ("Group_gain: members.", members); members = 1; } lch = (ch->leader != NULL) ? ch->leader : ch; for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) { // int xpmod = 100; OBJ_DATA *obj; OBJ_DATA *obj_next; char buf[100]; if (!is_same_group (gch, ch)) continue; if (!IS_SET (gch->extra2, AGREED) && gch->mkill > 20) { stc ("#wYou are unable to gain any more EXP until you type: #rRULES\n\r", gch); continue; } xp = xp_compute (gch, victim) / members; // xp = xp * xpmod / 100; if (xp > 0 && gch->in_room == victim->in_room) // tidied this up so it looks much better - Serenity { bool gain_qp_bonus = FALSE; bool gain_status_bonus = FALSE; int gainstatus = number_range (1,1000000); switch (gainstatus) { default: break; case 50000: gain_status_bonus = TRUE; break; } int gainqp = number_range (1, 2000); switch (gainqp) { default: break; case 999: case 666: case 500: case 200: case 150: case 100: case 50: gain_qp_bonus = TRUE; break; } if (gain_status_bonus) { if (ch->race > 0) { sprintf (buf, "#w#FYou are blessed with 1 status for this kill.#n\n\r"); ch->race = ch->race + 1; } } if (gain_qp_bonus) { if (IS_EXTRA2 (gch, EXTRA2_INFECTED) && IS_PARA (5)) gainqp *= 1.5; if (WizConfig->qpbonus > 1) gainqp *= WizConfig->qpbonus; sprintf (buf, "#w#FYou are blessed with %d quest points for this kill.#n\n\r", gainqp); if (gch->pcdata->score[SCORE_QUEST] < 45000) gch->pcdata->score[SCORE_QUEST] += gainqp; gch->pcdata->quest += gainqp; stc (buf, gch); } } //stc("#rM#ga#yL#cs#wT#oa#rR #bb#gI#cr#rT#wh#gD#ra#yY #bb#cO#gn#rU#ys#o!#n\n\r",gch); if (get_hours (gch) < 6) { if (gch->master == NULL || gch->leader == NULL) { sprintf (buf, "#w[You receive #r%d#w newbie experience points]#n\n\r", xp); if (IS_SET (gch->more, PLR_COMB_EXP)) { gch->combined_exp += xp; xp = 0; if (IS_CLASS (gch, CLASS_DEMON)) gch->combined_cp += victim->level; if (IS_CLASS (gch, CLASS_DROW)) gch->combined_cp += ((victim->level * 4) / 3); } else { stc (buf, gch); } } else { sprintf (buf, "#w[You receive #r%d #wexperience points]#n\n\r", xp); if (IS_SET (gch->more, PLR_COMB_EXP)) { gch->combined_exp += xp; xp = 0; if (IS_CLASS (gch, CLASS_DEMON)) gch->combined_cp += victim->level; if (IS_CLASS (gch, CLASS_DROW)) gch->combined_cp += ((victim->level * 4) / 3); } else { stc (buf, gch); } } } else { sprintf (buf, "#w[You receive #r%d #wexperience points]#n\n\r", xp); if (IS_SET (gch->more, PLR_COMB_EXP)) { gch->combined_exp += xp; xp = 0; if (IS_CLASS (gch, CLASS_DEMON)) gch->combined_cp += victim->level; if (IS_CLASS (gch, CLASS_DROW)) gch->combined_cp += ((victim->level * 4) / 3); } else { stc (buf, gch); } } if (IS_SET(gch->more, MORE_AQUEST)&&IS_NPC(victim)) { if (gch->questmob == victim->pIndexData->vnum) { send_to_char("#rYou have almost completed your QUEST!#n\n\r",gch); send_to_char("#rReturn to the questmaster before your time runs out!#n\n\r",gch); gch->questmob = -1; } } // hmm if (IS_CLASS (gch, CLASS_DEMON) && (xp > 0) && (!IS_SET (gch->more, PLR_COMB_EXP))) stcprintf (gch, "You receive %d Demon Points for this kill.\n\r", victim->level); if (IS_CLASS (gch, CLASS_DROW) && (xp > 0) && (!IS_SET (gch->more, PLR_COMB_EXP))) stcprintf (gch, "You receive %d Drow Points.\n\r", (victim->level * 4) / 3); if (IS_SET (gch->more, MORE_QUESTOR) && IS_NPC (victim)) { if (gch->questmob == victim->pIndexData->vnum) { send_to_char ("You have almost completed your QUEST!\n\r", gch); send_to_char ("Return to the questmaster before your time runs out!\n\r", gch); gch->questmob = -1; } } if ((mount = gch->mount) != NULL) send_to_char (buf, mount); if ((xp > 0) && (!IS_SET (gch->more, PLR_COMB_EXP))) gain_exp (gch, xp); for (obj = gch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (obj->wear_loc == WEAR_NONE) continue; if ((IS_OBJ_STAT (obj, ITEM_ANTI_EVIL) && IS_EVIL (gch)) || (IS_OBJ_STAT (obj, ITEM_ANTI_GOOD) && IS_GOOD (gch)) || (IS_OBJ_STAT (obj, ITEM_ANTI_NEUTRAL) && IS_NEUTRAL (gch))) { act ("You are zapped by $p.", gch, obj, NULL, TO_CHAR); act ("$n is zapped by $p.", gch, obj, NULL, TO_ROOM); obj_from_char (obj); obj_to_room (obj, gch->in_room); } } } return; } /* * Compute xp for a kill. * Also adjust alignment of killer. * Edit this function to change xp computations. */ int xp_compute (CHAR_DATA * gch, CHAR_DATA * victim) { CHAR_DATA *xch; // char buf[MAX_STRING_LENGTH]; bool newbieexp = FALSE; int align, vnum, level, number, extra; long long xp; // int ldr,ldrz; int xtra_xp = number_range (1, 1500); xp = 300 - URANGE (-3, 3 - victim->level, 6) * 50; align = gch->alignment - victim->alignment; if (IS_HERO (gch)) { /* Avatars shouldn't be able to change their alignment */ if (IS_CLASS (gch, CLASS_DEMON)) gch->alignment = -1000; else gch->alignment = gch->alignment; } else if (align > 500) gch->alignment = UMIN (gch->alignment + (align - 500) / 4, 1000); else if (align < -500) gch->alignment = UMAX (gch->alignment + (align + 500) / 4, -1000); else gch->alignment -= gch->alignment / 4; if (IS_NPC (victim) && (vnum = victim->pIndexData->vnum) > 29000) { switch (vnum) { default: break; case 29600: case 30000: case 30001: case 30006: case 30007: case 30008: case 30009: case 30010: case 30012: case 30013: case 30014: case 30015: case 30016: return 0; } } if (IS_NPC (victim) && (IS_SET (victim->act, ACT_NOEXP))) return 0; level = URANGE (0, victim->level, MAX_LEVEL - 1); number = UMAX (1, kill_table[level].number); extra = IS_NPC (victim) ? (victim->pIndexData->killed - kill_table[level].killed / number) : 0; xp -= xp * URANGE (-2, extra, 2) / 8; xp = number_range (xp * 3 / 4, xp * 5 / 4); xp = UMAX (0, xp); xp = (xp * (victim->level+1)/3); xp = xp*1.5; if (IS_NEWBIE(gch)) { for (xch = gch->in_room->people; xch != NULL; xch = xch->next_in_room) { if (is_same_group (gch, xch)) newbieexp = FALSE; else newbieexp = TRUE; } } if (newbieexp) xp = xp * 3; if ((global_exp) && get_hours (gch) >= 6) xp = xp * 2; if (IS_SET (gch->extra2, EXTRA2_INFECTED) && IS_PARA (2) && get_hours (gch) >= 6) xp *= 3; /* ldr = 0; if (!str_cmp(gch->name,leader_board.bestpk_name)) ldr += 10; if (!str_cmp(gch->name,leader_board.pk_name)) ldr += 10; if (!str_cmp(gch->name,leader_board.aw_name)) ldr += 10; if (!str_cmp(gch->name,leader_board.mk_name)) ldr += 10; if (!str_cmp(gch->name,leader_board.tt_name)) ldr += 10; if (!str_cmp(gch->name,leader_board.xp_name)) ldr += 10; if (!str_cmp(gch->name,leader_board.qp_name)) ldr += 10; if (!str_cmp(gch->name,leader_board.qc_name)) ldr += 10; if (!str_cmp(gch->name,leader_board.tl_name)) ldr += 10; if (ldr > 40) ldr = 40; ldrz = (xp * ldr)/100; xp += ldrz; */ /* So people dont get Rediculous exp payouts */ if (WizConfig->xpbonus < 1) { if (xtra_xp == 1500) xp = xp * 4; else if (xtra_xp == 1400) xp = xp * 3; else if (xtra_xp == 1300) xp = xp * 2; } if ((WizConfig->xpbonus > 1) && !IS_NEWBIE(gch)) xp = xp * WizConfig->xpbonus; if (!IS_NPC (gch) && IS_NPC (victim)) { if (victim->level > gch->pcdata->score[SCORE_HIGH_LEVEL]) gch->pcdata->score[SCORE_HIGH_LEVEL] = victim->level; if (xp > gch->pcdata->score[SCORE_HIGH_XP]) gch->pcdata->score[SCORE_HIGH_XP] = xp; } //xp = xp * 2; return xp; } void dam_message (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt) { static char *const attack_table[] = { "hit", "slice", "stab", "slash", "whip", "claw", "blast", "pound", "crush", "grep", "bite", "pierce", "suck" }; static char *const attack_table2[] = { "hits", "slices", "stabs", "slashes", "whips", "claws", "blasts", "pounds", "crushes", "greps", "bites", "pierces", "sucks" }; char buf1[512], buf2[512], buf3[512]; const char *vs; const char *vp; const char *attack=NULL; const char *attack2; int damp; int bodyloc; int recover = 0; bool critical = FALSE; char punct; #ifdef FUCK_PLAYERS if (IS_NPC (victim) && !IS_NPC (ch)) dam /= 1000; if (!IS_NPC (ch) && !IS_NPC (victim)) dam /= 1000; #endif if (dt == TYPE_HIT && !IS_NPC (ch) && (IS_VAMPAFF (ch, VAM_CLAWS) || IS_CLASS (ch, CLASS_DRAGON))) { attack = attack_table[dt - TYPE_HIT + 5]; attack2 = attack_table2[dt - TYPE_HIT + 5]; } else if (dt >= 0 && dt < MAX_SKILL) { attack = skill_table[dt].noun_damage; attack2 = skill_table[dt].noun_damage; } else if (dt >= TYPE_HIT && dt < TYPE_HIT + sizeof (attack_table) / sizeof (attack_table[0])) { attack = attack_table[dt - TYPE_HIT]; attack2 = attack_table2[dt - TYPE_HIT]; } else { /* bug( "Dam_mes\sage: bad dt %d.", dt ); */ dt = TYPE_HIT; attack = attack_table[0]; attack2 = attack_table2[0]; } if (IS_IMMUNE (victim, IMM_SLASH) && (attack == "slash" || attack == "slice") && dam > 0) recover = number_range (1, dam); if (IS_IMMUNE (victim, IMM_STAB) && (attack == "stab" || attack == "pierce") && dam > 0) recover = number_range (1, dam); if (IS_IMMUNE (victim, IMM_SMASH) && (attack == "blast" || attack == "pound" || attack == "crush") && dam > 0) recover = number_range (1, dam); if (IS_IMMUNE (victim, IMM_ANIMAL) && (attack == "hit" || attack == "bite" || attack == "claw") && dam > 0) recover = number_range (1, dam); if (IS_IMMUNE (victim, IMM_MISC) && (attack == "grep" || attack == "suck" || attack == "whip") && dam > 0) recover = number_range (1, dam); if (IS_SUPER_NPC (victim)) recover = number_range (1, dam); if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_DEMON) && (dam - recover) > 0 && IS_DEMPOWER (victim, DEM_TOUGH)) recover += number_range (1, (dam - recover)); if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_WEREWOLF) && (dam - recover) > 0 && (victim->pcdata->stats[UNI_RAGE] > 200)) recover += number_range (50, (dam - recover)); /*herematt */ if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_DRAGON) && (dam - recover) > 0 && IS_SET (victim->pcdata->dragonaff, DRA_TOUGHNESS)) recover += (number_range (50, (dam - recover))); if (recover > dam) recover = dam; dam -= recover; victim->hit += recover; if (!IS_NPC (ch) && IS_SET (ch->more, SHORT_COMBAT)) { ch->amount_damage_dealt -= recover; if (dam < 1) ch->amount_attacks_dealt--; } if (!IS_NPC (victim) && IS_SET (victim->more, SHORT_COMBAT)) { victim->amount_damage_received -= recover; if (dam < 1) victim->amount_attacks_received--; } if (WORN_ARTIFACT (ch, ARTI_SHATTERED_BLADE) || WORN_ARTIFACT (ch, ARTI_DEMONS_HEART) || (WORN_ARTIFACT (ch, ARTI_LIONS_MANE) && IS_SET(ch->more, MORE_LIONSMANE))) { victim->amount_damage_received += dam * .25; dam *= 1.25; } if (WORN_ARTIFACT (ch, ARTI_PLATE_IRON_GAUNTLET) || WORN_ARTIFACT (ch, ARTI_METEORIC_AXE) || WORN_ARTIFACT (ch, ARTI_CROWN_OF_CHRYSTANCIA)) { victim->amount_damage_received += dam * .1; dam *= 1.1; } if (WORN_ARTIFACT (victim, ARTI_GREENLEAF_CLOAK) && !IS_SET (victim->flag2, AFF2_INARENA) && victim->in_room != NULL && victim->in_room->sector_type != SECT_INSIDE && victim->in_room->sector_type != SECT_CITY) { victim->amount_damage_received -= dam * .25; dam *= 0.75; } if (!IS_NPC (ch) && IS_SET (ch->extra2, NEW_REND) && dam > 0 && number_range (1, 7) == 5) critical = TRUE; if (dam == 0) { vs = " #cmiss#n"; vp = " #cmisses#n"; } else if (dam <= 25) { vs = " #ylike a wuss#n"; vp = " #ylike a wuss#n"; } else if (dam <= 50) { vs = " #glightly#n"; vp = " #glightly#n"; } else if (dam <= 100) { vs = " #ghard#n"; vp = " #ghard#n"; } else if (dam <= 250) { vs = " #bvery hard#n"; vp = " #bvery hard#n"; } else if (dam <= 500) { vs = " #bextremely hard#n"; vp = " #bextremely hard#n"; } else if (dam <= 1000) { vs = "#r incredibly hard#n"; vp = " #rincredibly hard#n"; } else if (dam <= 1500) { vs = " #ramazingly hard#n"; vp = " #ramazingly hard#n"; } else if (dam <= 2000) { vs = " #rinsanely hard#n"; vp = " #rinsanely hard#n"; } else if (dam <= 2750) { vs = " #runbelievably hard#n"; vp = " #runbelievably hard#n"; } else if (dam <= 4000) { vs = " #Rwith #rU#RL#rT#RI#rM#RA#rT#RE#r power#n"; vp = " #Rwith #rU#RL#rT#RI#rM#RA#rT#RE#r power#n"; } else if (dam <= 5500) { vs = " #pwith #cU#pN#cG#pO#cD#pL#cY #pvengeance#n"; vp = " #pwith #cU#pN#cG#pO#cD#pL#cY #pvengeance#n"; } else { vs = " #ywith #wUNMERCIFUL #ystrength!#n"; vp = " #ywith #wUNMERCIFUL #ystrength!#n"; } /* If victim's hp are less/equal to 'damp', attacker gets a death blow */ if (IS_NPC (victim)) damp = 0; else damp = -10; if ((victim->hit - dam > damp) || (dt >= 0 && dt < MAX_SKILL) || (IS_NPC (victim) && IS_SET (victim->act, ACT_NOPARTS))) { punct = (dam <= 250) ? '.' : '!'; if (dt == TYPE_HIT && !IS_NPC (ch) && !IS_VAMPAFF (ch, VAM_CLAWS)) { if (dam == 0) { sprintf (buf1, "$n%s $N%c", vp, punct); sprintf (buf2, "You%s $N%c", vs, punct); sprintf (buf3, "$n%s you%c", vp, punct); } else { sprintf (buf1, "$n hits $N%s%c", vp, punct); sprintf (buf2, "You hit $N%s%c#w[#r%d#w][#g%.1f#w:#g%.1f#w]", vs, punct, dam, ch->mult, victim->reduct); sprintf (buf3, "$n hits you%s%c#w[#r%d#w][#g%.1f#w:#g%.1f#w]", vp, punct, dam, ch->mult, victim->reduct); critical = TRUE; } } else { if (dam == 0) { sprintf (buf1, "$n's %s%s $N%c", attack, vp, punct); sprintf (buf2, "Your %s%s $N%c", attack, vp, punct); sprintf (buf3, "$n's %s%s you%c", attack, vp, punct); } else if (IS_SET (ch->newbits, NEW_MONKFLAME) && (dam == 0)) { sprintf (buf1, "$n's flaming %s%s $N%c", attack2, vp, punct); sprintf (buf2, "Your flaming %s%s $N%c", attack, vp, punct); sprintf (buf3, "$n's flaming %s%s you%c", attack2, vp, punct); } else { //Mac- This is where i think the checks for NO_SHIELDS Needs to go //Now i just gotta work it out :( if (dt >= 0 && dt < MAX_SKILL) { sprintf (buf1, "$n's %s strikes $N%s%c", attack2, vp, punct); sprintf (buf2, "Your %s strikes $N%s%c#w[#r%d#w][#g%.1f#w:#g%.1f#w]", attack, vp, punct, dam, ch->mult, victim->reduct); sprintf (buf3, "$n's %s strikes you%s%c#w[#r%d#w][#g%.1f#w:#g%.1f#w]", attack2, vp, punct, dam, ch->mult, victim->reduct); } else if (IS_SET (ch->newbits, NEW_MONKFLAME)) { sprintf (buf1, "$n's flaming %s hits $N%s%c", attack2, vp, punct); sprintf (buf2, "Your flaming %s hits $N%s%c#w[#r%d#w][#g%.1f#w:#g%.1f#w]", attack, vp, punct, dam, ch->mult, victim->reduct); sprintf (buf3, "$n's flaming %s hits you%s%c#w[#r%d#w][#g%.1f#w:#g%.1f#w]", attack2, vp, punct, dam, ch->mult, victim->reduct); } else { sprintf (buf1, "$n %s $N%s%c", attack2, vp, punct); sprintf (buf2, "You %s $N%s%c#w[#r%d#w][#g%.1f#w:#g%.1f#w]", attack, vp, punct, dam, ch->mult, victim->reduct); sprintf (buf3, "$n %s you%s%c#w[#r%d#w][#g%.1f#w:#g%.1f#w]", attack2, vp, punct, dam, ch->mult, victim->reduct); critical = TRUE; } } } if (!(IS_SET (ch->more, MORE_SHIELDS) && (dt == 37 || dt == 48 || dt == 12 || dt == 1 || dam == 0))) act (buf1, ch, NULL, victim, TO_NOTVICT); if (!IS_SET (ch->more, SHORT_COMBAT)) { if (!(IS_SET (ch->more, MORE_SHIELDS) && (dt == 37 || dt == 48 || dt == 12 || dt == 1 || dam == 0))) act (buf2, ch, NULL, victim, TO_CHAR); } if (!IS_SET (victim->more, SHORT_COMBAT)) { if (!(IS_SET (ch->more, MORE_SHIELDS) && (dt == 37 || dt == 48 || dt == 12 || dt == 1 || dam == 0))) act (buf3, ch, NULL, victim, TO_VICT); } if (critical) critical_hit (ch, victim, dt, dam); return; } if (dt == TYPE_HIT && !IS_NPC (ch) && !IS_VAMPAFF (ch, VAM_CLAWS) && !IS_VAMPAFF (ch, VAM_FANGS)) { damp = number_range (1, 5); if (damp == 1) { act ("You ram your fingers into $N's eye sockets and rip $S face off.", ch, NULL, victim, TO_CHAR); act ("$n rams $s fingers into $N's eye sockets and rips $S face off.", ch, NULL, victim, TO_NOTVICT); act ("$n rams $s fingers into your eye sockets and rips your face off.", ch, NULL, victim, TO_VICT); victim->form = 21; make_part (victim, "face"); } else if (damp == 2) { act ("You grab $N by the throat and tear $S windpipe out.", ch, NULL, victim, TO_CHAR); act ("$n grabs $N by the throat and tears $S windpipe out.", ch, NULL, victim, TO_NOTVICT); act ("$n grabs you by the throat and tears your windpipe out.", ch, NULL, victim, TO_VICT); victim->form = 22; make_part (victim, "windpipe"); } else if (damp == 3) { act ("You punch your fist through $N's stomach and rip out $S entrails.", ch, NULL, victim, TO_CHAR); act ("$n punches $s fist through $N's stomach and rips out $S entrails.", ch, NULL, victim, TO_NOTVICT); act ("$n punches $s fist through your stomach and rips out your entrails.", ch, NULL, victim, TO_VICT); victim->form = 23; make_part (victim, "entrails"); } else if (damp == 4) { if (!IS_BODY (victim, BROKEN_SPINE)) SET_BIT (victim->loc_hp[1], BROKEN_SPINE); act ("You hoist $N above your head and slam $M down upon your knee.\n\rThere is a loud cracking sound as $N's spine snaps.", ch, NULL, victim, TO_CHAR); act ("$n hoists $N above $s head and slams $M down upon $s knee.\n\rThere is a loud cracking sound as $N's spine snaps.", ch, NULL, victim, TO_NOTVICT); act ("$n hoists you above $s head and slams you down upon $s knee.\n\rThere is a loud cracking sound as your spine snaps.", ch, NULL, victim, TO_VICT); victim->form = 24; } else if (damp == 5) { act ("You lock your arm around $N's head, and give it a vicious twist.", ch, NULL, victim, TO_CHAR); act ("$n locks $s arm around $N's head, and gives it a vicious twist.", ch, NULL, victim, TO_NOTVICT); act ("$n locks $s arm around your head, and gives it a vicious twist.", ch, NULL, victim, TO_VICT); if (!IS_BODY (victim, BROKEN_NECK)) { act ("There is a loud snapping noise as your neck breaks.", victim, NULL, NULL, TO_CHAR); act ("There is a loud snapping noise as $n's neck breaks.", victim, NULL, NULL, TO_ROOM); SET_BIT (victim->loc_hp[1], BROKEN_NECK); } victim->form = 25; } return; } if (dt >= 0 && dt < MAX_SKILL) attack = skill_table[dt].noun_damage; else if (dt >= TYPE_HIT && dt < TYPE_HIT + sizeof (attack_table) / sizeof (attack_table[0])) attack = attack_table[dt - TYPE_HIT]; else { dt = TYPE_HIT; attack = attack_table[0]; } if (attack == "slash" || attack == "slice") { damp = number_range (1, 8); if (damp == 1) { act ("You swing your blade in a low arc, rupturing $N's abdominal cavity.\n\r$N's entrails spray out over a wide area.", ch, NULL, victim, TO_CHAR); act ("$n swings $s blade in a low arc, rupturing $N's abdominal cavity.\n\r$N's entrails spray out over a wide area.", ch, NULL, victim, TO_NOTVICT); act ("$n swings $s blade in a low arc, rupturing your abdominal cavity.\n\rYour entrails spray out over a wide area.", ch, NULL, victim, TO_VICT); victim->form = 26; make_part (victim, "entrails"); } else if (damp == 2) { act ("You thrust your blade into $N's mouth and twist it viciously.\n\rThe end of your blade bursts through the back of $S head.", ch, NULL, victim, TO_CHAR); act ("$n thrusts $s blade into $N's mouth and twists it viciously.\n\rThe end of the blade bursts through the back of $N's head.", ch, NULL, victim, TO_NOTVICT); act ("$n thrusts $s blade into your mouth and twists it viciously.\n\rYou feel the end of the blade burst through the back of your head.", ch, NULL, victim, TO_VICT); victim->form = 27; } else if (damp == 3) { if (!IS_BODY (victim, CUT_THROAT)) SET_BIT (victim->loc_hp[1], CUT_THROAT); if (!IS_BLEEDING (victim, BLEEDING_THROAT)) SET_BIT (victim->loc_hp[6], BLEEDING_THROAT); act ("Your blow slices open $N's carotid artery, spraying blood everywhere.", ch, NULL, victim, TO_CHAR); act ("$n's blow slices open $N's carotid artery, spraying blood everywhere.", ch, NULL, victim, TO_NOTVICT); act ("$n's blow slices open your carotid artery, spraying blood everywhere.", ch, NULL, victim, TO_VICT); victim->form = 28; make_part (victim, "blood"); } else if (damp == 4) { if (!IS_BODY (victim, CUT_THROAT)) SET_BIT (victim->loc_hp[1], CUT_THROAT); if (!IS_BLEEDING (victim, BLEEDING_THROAT)) SET_BIT (victim->loc_hp[6], BLEEDING_THROAT); act ("You swing your blade across $N's throat, showering the area with blood.", ch, NULL, victim, TO_CHAR); act ("$n swings $s blade across $N's throat, showering the area with blood.", ch, NULL, victim, TO_NOTVICT); act ("$n swings $s blade across your throat, showering the area with blood.", ch, NULL, victim, TO_VICT); victim->form = 29; make_part (victim, "blood"); } else if (damp == 5) { if (!IS_HEAD (victim, BROKEN_SKULL)) { act ("You swing your blade down upon $N's head, splitting it open.\n\r$N's brains pour out of $S forehead.", ch, NULL, victim, TO_CHAR); act ("$n swings $s blade down upon $N's head, splitting it open.\n\r$N's brains pour out of $S forehead.", ch, NULL, victim, TO_NOTVICT); act ("$n swings $s blade down upon your head, splitting it open.\n\rYour brains pour out of your forehead.", ch, NULL, victim, TO_VICT); victim->form = 30; make_part (victim, "brain"); SET_BIT (victim->loc_hp[0], BROKEN_SKULL); } else { act ("You plunge your blade deep into $N's chest.", ch, NULL, victim, TO_CHAR); act ("$n plunges $s blade deep into $N's chest.", ch, NULL, victim, TO_NOTVICT); act ("$n plunges $s blade deep into your chest.", ch, NULL, victim, TO_VICT); victim->form = 31; } } else if (damp == 6) { act ("You swing your blade between $N's legs, nearly splitting $M in half.", ch, NULL, victim, TO_CHAR); act ("$n swings $s blade between $N's legs, nearly splitting $M in half.", ch, NULL, victim, TO_NOTVICT); act ("$n swings $s blade between your legs, nearly splitting you in half.", ch, NULL, victim, TO_VICT); victim->form = 32; } else if (damp == 7) { if (!IS_ARM_L (victim, LOST_ARM)) { act ("You swing your blade in a wide arc, slicing off $N's arm.", ch, NULL, victim, TO_CHAR); act ("$n swings $s blade in a wide arc, slicing off $N's arm.", ch, NULL, victim, TO_NOTVICT); act ("$n swings $s blade in a wide arc, slicing off your arm.", ch, NULL, victim, TO_VICT); victim->form = 33; make_part (victim, "arm"); SET_BIT (victim->loc_hp[2], LOST_ARM); 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); } else if (!IS_ARM_R (victim, LOST_ARM)) { act ("You swing your blade in a wide arc, slicing off $N's arm.", ch, NULL, victim, TO_CHAR); act ("$n swings $s blade in a wide arc, slicing off $N's arm.", ch, NULL, victim, TO_NOTVICT); act ("$n swings $s blade in a wide arc, slicing off your arm.", ch, NULL, victim, TO_VICT); victim->form = 33; make_part (victim, "arm"); SET_BIT (victim->loc_hp[3], LOST_ARM); 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); } else { act ("You plunge your blade deep into $N's chest.", ch, NULL, victim, TO_CHAR); act ("$n plunges $s blade deep into $N's chest.", ch, NULL, victim, TO_NOTVICT); act ("$n plunges $s blade deep into your chest.", ch, NULL, victim, TO_VICT); victim->form = 31; } } else if (damp == 8) { if (!IS_LEG_L (victim, LOST_LEG)) { act ("You swing your blade in a low arc, slicing off $N's leg at the hip.", ch, NULL, victim, TO_CHAR); act ("$n swings $s blade in a low arc, slicing off $N's leg at the hip.", ch, NULL, victim, TO_NOTVICT); act ("$n swings $s blade in a wide arc, slicing off your leg at the hip.", ch, NULL, victim, TO_VICT); victim->form = 34; make_part (victim, "leg"); SET_BIT (victim->loc_hp[4], LOST_LEG); 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); } else if (!IS_LEG_R (victim, LOST_LEG)) { act ("You swing your blade in a low arc, slicing off $N's leg at the hip.", ch, NULL, victim, TO_CHAR); act ("$n swings $s blade in a low arc, slicing off $N's leg at the hip.", ch, NULL, victim, TO_NOTVICT); act ("$n swings $s blade in a wide arc, slicing off your leg at the hip.", ch, NULL, victim, TO_VICT); victim->form = 34; make_part (victim, "leg"); SET_BIT (victim->loc_hp[5], LOST_LEG); 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); } else { act ("You plunge your blade deep into $N's chest.", ch, NULL, victim, TO_CHAR); act ("$n plunges $s blade deep into $N's chest.", ch, NULL, victim, TO_NOTVICT); act ("$n plunges $s blade deep into your chest.", ch, NULL, victim, TO_VICT); victim->form = 31; } } } else if (attack == "stab" || attack == "pierce") { damp = number_range (1, 5); if (damp == 1) { act ("You defty invert your weapon and plunge it point first into $N's chest.\n\rA shower of blood sprays from the wound, showering the area.", ch, NULL, victim, TO_CHAR); act ("$n defty inverts $s weapon and plunge it point first into $N's chest.\n\rA shower of blood sprays from the wound, showering the area.", ch, NULL, victim, TO_NOTVICT); act ("$n defty inverts $s weapon and plunge it point first into your chest.\n\rA shower of blood sprays from the wound, showering the area.", ch, NULL, victim, TO_VICT); make_part (victim, "blood"); victim->form = 31; } else if (damp == 2) { act ("You thrust your blade into $N's mouth and twist it viciously.\n\rThe end of your blade bursts through the back of $S head.", ch, NULL, victim, TO_CHAR); act ("$n thrusts $s blade into $N's mouth and twists it viciously.\n\rThe end of the blade bursts through the back of $N's head.", ch, NULL, victim, TO_NOTVICT); act ("$n thrusts $s blade into your mouth and twists it viciously.\n\rYou feel the end of the blade burst through the back of your head.", ch, NULL, victim, TO_VICT); victim->form = 35; } else if (damp == 3) { act ("You thrust your weapon up under $N's jaw and through $S head.", ch, NULL, victim, TO_CHAR); act ("$n thrusts $s weapon up under $N's jaw and through $S head.", ch, NULL, victim, TO_NOTVICT); act ("$n thrusts $s weapon up under your jaw and through your head.", ch, NULL, victim, TO_VICT); victim->form = 27; } else if (damp == 4) { act ("You ram your weapon through $N's body, pinning $M to the ground.", ch, NULL, victim, TO_CHAR); act ("$n rams $s weapon through $N's body, pinning $M to the ground.", ch, NULL, victim, TO_NOTVICT); act ("$n rams $s weapon through your body, pinning you to the ground.", ch, NULL, victim, TO_VICT); victim->form = 31; } else if (damp == 5) { act ("You stab your weapon into $N's eye and out the back of $S head.", ch, NULL, victim, TO_CHAR); act ("$n stabs $s weapon into $N's eye and out the back of $S head.", ch, NULL, victim, TO_NOTVICT); act ("$n stabs $s weapon into your eye and out the back of your head.", ch, NULL, victim, TO_VICT); victim->form = 36; 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 if (attack == "blast" || attack == "pound" || attack == "crush") { damp = number_range (1, 3); bodyloc = 0; if (damp == 1) { act ("Your blow smashes through $N's chest, caving in half $S ribcage.", ch, NULL, victim, TO_CHAR); act ("$n's blow smashes through $N's chest, caving in half $S ribcage.", ch, NULL, victim, TO_NOTVICT); act ("$n's blow smashes through your chest, caving in half your ribcage.", ch, NULL, victim, TO_VICT); victim->form = 37; if (IS_BODY (victim, BROKEN_RIBS_1)) { bodyloc += 1; REMOVE_BIT (victim->loc_hp[1], BROKEN_RIBS_1); } if (IS_BODY (victim, BROKEN_RIBS_2)) { bodyloc += 2; REMOVE_BIT (victim->loc_hp[1], BROKEN_RIBS_2); } if (IS_BODY (victim, BROKEN_RIBS_4)) { bodyloc += 4; REMOVE_BIT (victim->loc_hp[1], BROKEN_RIBS_4); } if (IS_BODY (victim, BROKEN_RIBS_8)) { bodyloc += 8; REMOVE_BIT (victim->loc_hp[1], BROKEN_RIBS_8); } if (IS_BODY (victim, BROKEN_RIBS_16)) { bodyloc += 16; REMOVE_BIT (victim->loc_hp[1], BROKEN_RIBS_16); } bodyloc += number_range (1, 3); if (bodyloc > 24) bodyloc = 24; 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); } } else if (damp == 2) { act ("Your blow smashes $N's spine, shattering it in several places.", ch, NULL, victim, TO_CHAR); act ("$n's blow smashes $N's spine, shattering it in several places.", ch, NULL, victim, TO_NOTVICT); act ("$n's blow smashes your spine, shattering it in several places.", ch, NULL, victim, TO_VICT); victim->form = 38; if (!IS_BODY (victim, BROKEN_SPINE)) SET_BIT (victim->loc_hp[1], BROKEN_SPINE); } else if (damp == 3) { if (!IS_HEAD (victim, BROKEN_SKULL)) { act ("You swing your weapon down upon $N's head.\n\r$N's head cracks open like an overripe melon, leaking out brains.", ch, NULL, victim, TO_CHAR); act ("$n swings $s weapon down upon $N's head.\n\r$N's head cracks open like an overripe melon, covering you with brains.", ch, NULL, victim, TO_NOTVICT); act ("$n swings $s weapon down upon your head.\n\rYour head cracks open like an overripe melon, spilling your brains everywhere.", ch, NULL, victim, TO_VICT); make_part (victim, "brain"); victim->form = 30; SET_BIT (victim->loc_hp[0], BROKEN_SKULL); } else { act ("You hammer your weapon into $N's side, crushing bone.", ch, NULL, victim, TO_CHAR); act ("$n hammers $s weapon into $N's side, crushing bone.", ch, NULL, victim, TO_NOTVICT); act ("$n hammers $s weapon into your side, crushing bone.", ch, NULL, victim, TO_VICT); victim->form = 37; } } } else if (!IS_NPC (ch) && (attack == "bite" || IS_VAMPAFF (ch, VAM_FANGS))) { act ("You sink your teeth into $N's throat and tear out $S jugular vein.\n\rYou wipe the blood from your chin with one hand.", ch, NULL, victim, TO_CHAR); act ("$n sink $s teeth into $N's throat and tears out $S jugular vein.\n\r$n wipes the blood from $s chin with one hand.", ch, NULL, victim, TO_NOTVICT); act ("$n sink $s teeth into your throat and tears out your jugular vein.\n\r$n wipes the blood from $s chin with one hand.", ch, NULL, victim, TO_VICT); make_part (victim, "blood"); victim->form = 39; if (!IS_BODY (victim, CUT_THROAT)) SET_BIT (victim->loc_hp[1], CUT_THROAT); if (!IS_BLEEDING (victim, BLEEDING_THROAT)) SET_BIT (victim->loc_hp[6], BLEEDING_THROAT); } else if (!IS_NPC (ch) && (attack == "claw" || IS_VAMPAFF (ch, VAM_CLAWS))) { damp = number_range (1, 2); if (damp == 1) { act ("You tear out $N's throat, showering the area with blood.", ch, NULL, victim, TO_CHAR); act ("$n tears out $N's throat, showering the area with blood.", ch, NULL, victim, TO_NOTVICT); act ("$n tears out your throat, showering the area with blood.", ch, NULL, victim, TO_VICT); victim->form = 40; make_part (victim, "blood"); if (!IS_BODY (victim, CUT_THROAT)) SET_BIT (victim->loc_hp[1], CUT_THROAT); if (!IS_BLEEDING (victim, BLEEDING_THROAT)) SET_BIT (victim->loc_hp[6], BLEEDING_THROAT); } if (damp == 2) { if (!IS_HEAD (victim, LOST_EYE_L) && number_percent () < 50) { act ("You rip an eyeball from $N's face.", ch, NULL, victim, TO_CHAR); act ("$n rips an eyeball from $N's face.", ch, NULL, victim, TO_NOTVICT); act ("$n rips an eyeball from your face.", ch, NULL, victim, TO_VICT); make_part (victim, "eyeball"); victim->form = 41; SET_BIT (victim->loc_hp[0], LOST_EYE_L); } else if (!IS_HEAD (victim, LOST_EYE_R)) { act ("You rip an eyeball from $N's face.", ch, NULL, victim, TO_CHAR); act ("$n rips an eyeball from $N's face.", ch, NULL, victim, TO_NOTVICT); act ("$n rips an eyeball from your face.", ch, NULL, victim, TO_VICT); make_part (victim, "eyeball"); victim->form = 41; SET_BIT (victim->loc_hp[0], LOST_EYE_R); } else if (!IS_HEAD (victim, LOST_EYE_L)) { act ("You rip an eyeball from $N's face.", ch, NULL, victim, TO_CHAR); act ("$n rips an eyeball from $N's face.", ch, NULL, victim, TO_NOTVICT); act ("$n rips an eyeball from your face.", ch, NULL, victim, TO_VICT); make_part (victim, "eyeball"); victim->form = 41; SET_BIT (victim->loc_hp[0], LOST_EYE_L); } else { act ("You claw open $N's chest.", ch, NULL, victim, TO_CHAR); act ("$n claws open $N's chest.", ch, NULL, victim, TO_NOTVICT); act ("$n claws open $N's chest.", ch, NULL, victim, TO_VICT); victim->form = 42; } } } else if (attack == "whip") { act ("You entangle $N around the neck, and squeeze the life out of $M.", ch, NULL, victim, TO_CHAR); act ("$n entangle $N around the neck, and squeezes the life out of $M.", ch, NULL, victim, TO_NOTVICT); act ("$n entangles you around the neck, and squeezes the life out of you.", ch, NULL, victim, TO_VICT); victim->form = 25; if (!IS_BODY (victim, BROKEN_NECK)) SET_BIT (victim->loc_hp[1], BROKEN_NECK); } else if (attack == "suck" || attack == "grep") { act ("You place your weapon on $N's head and suck out $S brains.", ch, NULL, victim, TO_CHAR); act ("$n places $s weapon on $N's head and suck out $S brains.", ch, NULL, victim, TO_NOTVICT); act ("$n places $s weapon on your head and suck out your brains.", ch, NULL, victim, TO_VICT); victim->form = 43; } else { /*bug( "Dam_message: bad dt %d.", dt ); */ } return; } /* * Disarm a creature. * Caller must check for successful attack. */ void disarm (CHAR_DATA * ch, CHAR_DATA * victim) { OBJ_DATA *obj; char buf[MAX_STRING_LENGTH]; /* I'm fed up of being disarmed every 10 seconds - KaVir */ if (IS_NPC (ch) && victim->level > 2 && number_percent () > 5) return; if (IS_SUPER_NPC (victim)) return; if (!IS_NPC (victim) && IS_IMMUNE (victim, IMM_DISARM) && !IS_SET (ch->warp, WARP_CLUMSY)) return; /* if ( ( (obj = get_eq_char( ch, WEAR_WIELD ) == NULL) || obj->item_type != ITEM_WEAPON ) && ( (obj = get_eq_char( ch, WEAR_HOLD ) == NULL) || obj->item_type != ITEM_WEAPON ) ) return; */ if (((obj = get_eq_char (victim, WEAR_WIELD)) == NULL) || obj->item_type != ITEM_WEAPON) { if (((obj = get_eq_char (victim, WEAR_HOLD)) == NULL) || obj->item_type != ITEM_WEAPON) if (((obj = get_eq_char (victim, WEAR_DUAL)) == NULL) || obj->item_type != ITEM_WEAPON) return; } sprintf (buf, "#w$n disarms you!#n"); act (buf, ch, NULL, victim, TO_VICT); sprintf (buf, "#wYou disarm $N!#n"); act (buf, ch, NULL, victim, TO_CHAR); sprintf (buf, "#w$n disarms $N!#n"); act (buf, ch, NULL, victim, TO_NOTVICT); obj_from_char (obj); /* Loyal weapons come back ;) KaVir */ if (IS_SET (obj->extra_flags, ITEM_LOYAL) && (!IS_NPC (victim))) { act ("$p leaps back into your hand!", victim, obj, NULL, TO_CHAR); act ("$p leaps back into $n's hand!", victim, obj, NULL, TO_ROOM); obj_to_char (obj, victim); do_wear (victim, obj->name); } else if (IS_NPC (victim)) obj_to_char (obj, victim); else obj_to_room (obj, victim->in_room); return; } /* * Trip a creature. * Caller must check for successful attack. */ void trip (CHAR_DATA * ch, CHAR_DATA * victim) { char buf[MAX_STRING_LENGTH]; if (IS_AFFECTED (victim, AFF_FLYING)) return; if (IS_NPC (ch) && victim->level > 2 && number_percent () > 5) return; if (IS_SUPER_NPC (victim)) return; if (!IS_NPC (victim)) { if (IS_CLASS (victim, CLASS_VAMPIRE) && IS_VAMPAFF (victim, VAM_FLYING)) return; if (IS_CLASS (victim, CLASS_DEMON) && IS_DEMAFF (victim, DEM_UNFOLDED)) return; if (IS_SET (victim->special, SPC_CHAMPION) && IS_DEMAFF (victim, DEM_UNFOLDED)) return; if (IS_CLASS (victim, CLASS_DROW) && IS_SET (victim->pcdata->powers[1], DPOWER_LEVITATION)) return; } if (victim->wait == 0) { sprintf (buf, "#w$n trips you and you go down!#n"); act (buf, ch, NULL, victim, TO_VICT); sprintf (buf, "#wYou trip $N and $E goes down!#n"); act (buf, ch, NULL, victim, TO_CHAR); sprintf (buf, "#w$n trips $N and $E goes down!#n"); act (buf, ch, NULL, victim, TO_NOTVICT); WAIT_STATE (ch, 2 * PULSE_VIOLENCE); WAIT_STATE (victim, 2 * PULSE_VIOLENCE); victim->position = POS_RESTING; } return; } void do_kill (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument (argument, arg); if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_VAMPIRE)) do_majesty (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_FAE)) do_grandeur (ch, ""); if (arg[0] == '\0') { send_to_char ("Kill whom?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (victim == ch) { send_to_char ("You cannot kill yourself!\n\r", ch); return; } if (is_safe (ch, victim)) return; if (IS_AFFECTED (ch, AFF_CHARM) && ch->master == victim) { act ("$N is your beloved master.", ch, NULL, victim, TO_CHAR); return; } if (ch->position == POS_FIGHTING) { send_to_char ("You do the best you can!\n\r", ch); return; } /* Autostancing - Loki */ if (!IS_NPC (victim) && IS_SET (victim->extra, EXTRA_STANCE)) { if (victim->stance[11] == STANCE_VIPER) do_stance (victim, "viper"); else if (victim->stance[11] == STANCE_CRANE) do_stance (victim, "crane"); else if (victim->stance[11] == STANCE_CRAB) do_stance (victim, "crab"); else if (victim->stance[11] == STANCE_MONGOOSE) do_stance (victim, "mongoose"); else if (victim->stance[11] == STANCE_BULL) do_stance (victim, "bull"); else if (victim->stance[11] == STANCE_MANTIS) do_stance (victim, "mantis"); else if (victim->stance[11] == STANCE_DRAGON) do_stance (victim, "dragon"); else if (victim->stance[11] == STANCE_TIGER) do_stance (victim, "tiger"); else if (victim->stance[11] == STANCE_MONKEY) do_stance (victim, "monkey"); else if (victim->stance[11] == STANCE_SWALLOW) do_stance (victim, "swallow"); } /* Autostancing - Loki */ if (!IS_NPC (ch) && IS_SET (ch->extra, EXTRA_STANCE)) { if (ch->stance[11] == STANCE_VIPER) do_stance (ch, "viper"); else if (ch->stance[11] == STANCE_CRANE) do_stance (ch, "crane"); else if (ch->stance[11] == STANCE_CRAB) do_stance (ch, "crab"); else if (ch->stance[11] == STANCE_MONGOOSE) do_stance (ch, "mongoose"); else if (ch->stance[11] == STANCE_BULL) do_stance (ch, "bull"); else if (ch->stance[11] == STANCE_MANTIS) do_stance (ch, "mantis"); else if (ch->stance[11] == STANCE_DRAGON) do_stance (ch, "dragon"); else if (ch->stance[11] == STANCE_TIGER) do_stance (ch, "tiger"); else if (ch->stance[11] == STANCE_MONKEY) do_stance (ch, "monkey"); else if (ch->stance[11] == STANCE_SWALLOW) do_stance (ch, "swallow"); } WAIT_STATE (ch, (1 * PULSE_VIOLENCE) / 2); check_killer (ch, victim); if (!IS_NPC (ch) && !IS_NPC (victim) && !is_safe (ch, victim) && !is_safe (victim, ch)) { ch->fight_timer += 3; victim->fight_timer += 3; } if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_WEREWOLF) && number_range (1, 3) == 1 && ch->pcdata->powers[WPOWER_BOAR] > 1 && victim->position == POS_STANDING) { act ("You charge into $N, knocking $M from $S feet.", ch, NULL, victim, TO_CHAR); act ("$n charge into $N, knocking $M from $S feet.", ch, NULL, victim, TO_NOTVICT); act ("$n charge into you, knocking you from your feet.", ch, NULL, victim, TO_VICT); victim->position = POS_STUNNED; multi_hit (ch, victim, TYPE_UNDEFINED); multi_hit (ch, victim, TYPE_UNDEFINED); return; } else if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_NINGENNO] > 1 && IS_SET (ch->act, PLR_WIZINVIS) && victim->position == POS_STANDING) { act ("Your arms multiply, hitting $N many times.", ch, NULL, victim, TO_CHAR); act ("$n's arms multiply, hitting $N many times.", ch, NULL, victim, TO_NOTVICT); act ("$n's arms multiply, hitting you many times.", ch, NULL, victim, TO_VICT); multi_hit (ch, victim, TYPE_UNDEFINED); multi_hit (ch, victim, TYPE_UNDEFINED); return; } multi_hit (ch, victim, TYPE_UNDEFINED); return; } void do_circle (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; int dam; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_NINJA) || ch->pcdata->powers[NPOWER_NINGENNO] < 6) { send_to_char ("Huh?\n\r", ch); return; } if ( ( victim = ch->fighting ) == NULL ) { if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } } if (victim == ch) { send_to_char ("How can you circle yourself?\n\r", ch); return; } if (is_safe (ch, victim)) return; if (((obj = get_eq_char (ch, WEAR_WIELD)) == NULL || obj->value[3] != 11) && ((obj = get_eq_char (ch, WEAR_HOLD)) == NULL || obj->value[3] != 11) && ((obj = get_eq_char (ch, WEAR_DUAL)) == NULL || obj->value[3] != 11)) { send_to_char ("You need to wield a piercing weapon.\n\r", ch); return; } check_killer (ch, victim); dam = ch->wpn[11] * 5; dam += ch->race * 10; dam += char_damroll (ch); dam += ch->damcap[0]/2; damage (ch, victim, dam, gsn_circle); if (number_range(1,20) == 20) { damage (ch, victim, dam, gsn_circle); } WAIT_STATE (ch, skill_table[gsn_kick].beats); return; } void do_backstab (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Backstab whom?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (victim == ch) { send_to_char ("How can you sneak up on yourself?\n\r", ch); return; } if (is_safe (ch, victim)) return; if (((obj = get_eq_char (ch, WEAR_WIELD)) == NULL || obj->value[3] != 11) && ((obj = get_eq_char (ch, WEAR_HOLD)) == NULL || obj->value[3] != 11) && ((obj = get_eq_char (ch, WEAR_DUAL)) == NULL || obj->value[3] != 11)) { send_to_char ("You need to wield a piercing weapon.\n\r", ch); return; } if (victim->fighting != NULL) { send_to_char ("You can't backstab a fighting person.\n\r", ch); return; } if (victim->hit < victim->max_hit && !IS_CLASS (ch, CLASS_DROW)) { act ("$N is hurt and suspicious ... you can't sneak up.", ch, NULL, victim, TO_CHAR); return; } check_killer (ch, victim); WAIT_STATE (ch, skill_table[gsn_backstab].beats); if (!IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_NINJA) && !IS_NPC (victim) && IS_IMMUNE (victim, IMM_BACKSTAB)) { if ((IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_NINGENNO] < 2) || (!IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (ch, CLASS_NINJA))) damage (ch, victim, 0, gsn_backstab); } else if (!IS_AWAKE (victim) || IS_NPC (ch) || number_percent () < ch->pcdata->learned[gsn_backstab]) multi_hit (ch, victim, gsn_backstab); else { one_hit (ch, victim, gsn_backstab, 1); } return; } void do_flee (CHAR_DATA * ch, char *argument) { ROOM_INDEX_DATA *was_in; ROOM_INDEX_DATA *now_in; CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; int attempt; if (IS_CLASS (ch, CLASS_HIGHLANDER)) WAIT_STATE (ch, 24); else WAIT_STATE (ch, 20); if ((victim = ch->fighting) == NULL) { if (ch->position == POS_FIGHTING) ch->position = POS_STANDING; send_to_char ("You aren't fighting anyone.\n\r", ch); return; } if (ch->move <= 0) { send_to_char ("You can't find the energy to leave.\n\r", ch); return; } if (IS_CLASS (ch, CLASS_HIGHLANDER) && (ch->fight_timer > 0) && (ch->quickening[0] > 0)) { stc ("You were unable to escape!!\n\r", ch); WAIT_STATE (ch, 12); return; } if (IS_AFFECTED (ch, AFF_WEBBED)) { send_to_char ("You are unable to move with all this sticky webbing on.\n\r", ch); return; } if (IS_SET (ch->affected_by, AFF_ENTRAILS)) { send_to_char ("You are unable to move with these entrails entrapping you.\n\r", ch); return; } if (is_garou (victim) && victim->gifts[GETOFFENRIS] >= 1) { if (number_range (1, 4) == 2) { stc ("Gaia prevents you from fleeing her child.\n\r", ch); return; } } if (IS_CLASS (victim, CLASS_VAMPIRE) && IS_SET (victim->newbits, NEW_COIL) && number_percent () > 15) { sprintf (buf, "Not with %s coiled around you!", victim->name); send_to_char (buf, ch); act ("$n cant escape with $N coiled around them.", ch, NULL, victim, TO_ROOM); return; } if (IS_SET (ch->flag2, AFF2_TENDRILS)) { send_to_char ("You are unable to move while tangled in tendrils.\n\r", ch); return; } if (IS_SET (ch->flag2, AFF_TOTALBLIND)) { stc ("You are unable to see anything, let alone flee!\n\r", ch); return; } if (!IS_NPC (ch) && ch->pcdata->stats[UNI_RAGE] >= 0) { if (IS_CLASS (ch, CLASS_VAMPIRE) && number_percent () <= ch->pcdata->stats[UNI_RAGE]) { send_to_char ("Your inner beast refuses to let you run!\n\r", ch); WAIT_STATE (ch, 12); return; } else if (IS_CLASS (ch, CLASS_WEREWOLF) && number_percent () <= ch->pcdata->stats[UNI_RAGE] * 0.3) { send_to_char ("Your rage is too great!\n\r", ch); WAIT_STATE (ch, 12); return; } } was_in = ch->in_room; for (attempt = 0; attempt < 6; attempt++) { EXIT_DATA *pexit; int door; if (WORN_ARTIFACT(ch, ARTI_MAIDENS_BREATH)) break; door = number_door (); if ((pexit = was_in->exit[door]) == 0 || pexit->to_room == NULL || IS_SET (pexit->exit_info, EX_CLOSED) || (IS_NPC (ch) && IS_SET (pexit->to_room-> room_flags, ROOM_NO_MOB))) continue; if (ch->in_room->vnum >= 32900 && ch->in_room->vnum <= 32904 && door == 4) continue; if (ch->fight_timer > 0 && ch->in_room->vnum == 3001 && door == 0) continue; move_char (ch, door); if ((now_in = ch->in_room) == was_in) continue; ch->in_room = was_in; act ("$n has fled!", ch, NULL, NULL, TO_ROOM); ch->in_room = now_in; if (!IS_NPC (ch)) send_to_char ("You flee from combat! Coward!\n\r", ch); WAIT_STATE (ch, 12); if ((IS_CLASS (victim, CLASS_DROW) || (IS_CLASS(victim, CLASS_FAE) && IS_KITH (victim, KITH_SLUAGH))) && IS_SET (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (victim->in_room->room_flags, ROOM_TOTAL_DARKNESS); if ((IS_CLASS (victim, CLASS_DROW) || (IS_CLASS(victim, CLASS_FAE) && IS_KITH (victim, KITH_SLUAGH))) && IS_SET (victim->newbits, NEW_DARKNESS)) { stc ("You leave your darkness in a panic!\n\r", ch); REMOVE_BIT (victim->newbits, NEW_DARKNESS); act ("$N leaves $S darkness in a panic!", ch, NULL, victim, TO_NOTVICT); } stop_fighting (ch, TRUE); return; } send_to_char ("You were unable to escape!\n\r", ch); return; } void do_rescue (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; CHAR_DATA *fch; one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Rescue whom?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (victim == ch) { send_to_char ("What about fleeing instead?\n\r", ch); return; } if (!IS_NPC (ch) && IS_NPC (victim)) { send_to_char ("Doesn't need your help!\n\r", ch); return; } if (ch->fighting == victim) { send_to_char ("Too late.\n\r", ch); return; } if ((fch = victim->fighting) == NULL) { send_to_char ("That person is not fighting right now.\n\r", ch); return; } if (is_safe (ch, fch) || is_safe (ch, victim)) return; WAIT_STATE (ch, skill_table[gsn_rescue].beats); if (!IS_NPC (ch) && number_percent () > ch->pcdata->learned[gsn_rescue]) { send_to_char ("You fail the rescue.\n\r", ch); return; } act ("You rescue $N!", ch, NULL, victim, TO_CHAR); act ("$n rescues you!", ch, NULL, victim, TO_VICT); act ("$n rescues $N!", ch, NULL, victim, TO_NOTVICT); stop_fighting (fch, FALSE); stop_fighting (victim, FALSE); check_killer (ch, fch); set_fighting (ch, fch); set_fighting (fch, ch); do_humanity (ch, ""); return; } void do_kick (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *boots; int dam; int stance; int chance; one_argument (argument, arg); chance = number_percent (); if (IS_NPC (ch) && !IS_SUPER_NPC (ch)) { stc ("You cant kick!\n\r", ch); return; } if (!IS_NPC (ch) && ch->level < skill_table[gsn_kick].skill_level) { send_to_char ("First you should learn to kick.\n\r", ch); return; } if (!IS_NPC (ch) && chance > 40 && IS_CLASS (ch, CLASS_DEMON) && IS_SET (ch->warp, WARP_CLUMSY)) { stc ("You are so clumsy you fall on your ass trying to kick!\n\r", ch); ch->move -= 500; return; } if (!IS_NPC (ch) && IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_VAMPIRE)) do_majesty (ch, ""); if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_FAE)) do_grandeur (ch, ""); if (arg[0] == '\0' && ch->fighting == NULL) { send_to_char ("Who do you wish to kick?\n\r", ch); return; } if ((victim = ch->fighting) == NULL) { if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } } if (ch == victim) { send_to_char ("Kick YOURSELF?\n\r", ch); return; } if (!IS_NPC (ch) && IS_ITEMAFF (ch, ITEMA_PEACE)) { send_to_char ("You are unable to attack them.\n\r", ch); return; } if (!IS_NPC (victim) && IS_ITEMAFF (victim, ITEMA_PEACE)) { send_to_char ("You can't seem to attack them.\n\r", ch); return; } if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_SAFE)) { send_to_char ("You cannot attack people under Gaia's protection.\n\r", ch); return; } if (is_safe (ch, victim)) return; WAIT_STATE (ch, skill_table[gsn_kick].beats); if (IS_NPC (ch) || number_percent () < ch->pcdata->learned[gsn_kick]) dam = number_range (1, 4); else { dam = 0; damage (ch, victim, dam, gsn_kick); return; } if (ch->damcap[DAM_CHANGE] == 1) { update_damcap (ch, victim); } if (IS_CLASS(ch, CLASS_DEMON) ) dam += ch->damcap[0]; dam += char_damroll (ch); if (dam == 0) dam = 1; if (!IS_AWAKE (victim)) dam *= 2; if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_DRAGON)) dam *= 1.5; if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_DEMON) && IS_SET (ch->warp, WARP_STRONGLEGS)) { dam *= 1.5; } /* if ( !IS_NPC(ch) && IS_CLASS(ch, CLASS_VAMPIRE) && IS_VAMPAFF(ch, VAM_POTENCE) ) */ if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_VAMPIRE) && get_disc(ch, VAM_POTE) > 1) dam *= 1 + (get_disc(ch, VAM_POTE) * .1); // dam *= get_disc(ch, VAM_POTE); // dam *= 1.2; else if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_MONK) && ch->chi[CURRENT] > 0) dam *= 1 + (ch->chi[CURRENT] * .1); else if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_NINJA) && ch->pcdata->powers[NPOWER_CHIKYU] > 2) dam *= 1.25; /*drow */ else if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_DROW)) { if (IS_SET (ch->pcdata->powers[1], DPOWER_TOUGHSKIN)) dam *= 1.6; } /*drow*/ //Wraith else if (!IS_NPC (ch) && (IS_SET (ch->special, SPC_CHAMPION) || IS_CLASS (ch, CLASS_DEMON)) && IS_DEMPOWER (ch, DEM_MIGHT)) dam *= 1.2; else if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_HIGHLANDER)) { if IS_DEMPOWER (ch, HPOWER_MIGHT) dam *= 2; } if (!IS_NPC (ch) && IS_NDEMPOWER (ch, DEM_FLAMEHOOVES) && !IS_AFFECTED (victim, AFF_FLAMING) && !WORN_ARTIFACT (victim, ARTI_DEMONS_HEART)) { if (number_percent () > 65) SET_BIT (victim->affected_by, AFF_FLAMING); } if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_WEREWOLF)) { if (IS_SET (victim->special, SPC_WOLFMAN)) dam *= 0.5; if ((boots = get_eq_char (ch, WEAR_FEET)) != NULL && IS_SET (boots->spectype, SITEM_SILVER)) dam *= 2; } /* Vampires should be tougher at night and weaker during the day. */ if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_VAMPIRE)) { if (weather_info.sunlight == SUN_LIGHT && dam > 1 && !IS_IMMUNE (ch,IMM_SUNLIGHT)) dam /= 1.5; else dam *= 1.5; } if (!IS_NPC (ch)) dam = dam + (dam * ((ch->wpn[0] + 1) / 100)); if (!IS_NPC (ch)) { stance = ch->stance[0]; if (IS_STANCE (ch, STANCE_NORMAL)) dam *= 1.25; else dam = dambonus (ch, victim, dam, stance); } if (dam <= 0) dam = 1; if (!IS_NPC (victim) && IS_IMMUNE (victim, IMM_KICK) && !(IS_DEMAFF (ch, DEM_HOOVES) || IS_CLASS (ch, CLASS_DRAGON))) { dam = 0; damage (ch, victim, dam, gsn_kick); } else if (IS_SUPER_NPC (victim)) { dam = 0; damage (ch, victim, dam, gsn_kick); } /* if (!IS_NPC(victim) && IS_CLASS(victim, CLASS_HIGHLANDER) && IS_DEMPOWER(victim,HPOWER_TOUGHNESS)) { char buf [MAX_STRING_LENGTH]; int skin; int rebound; skin = number_range(1,50); rebound = number_range(1,50); if (skin == 10 || skin == 20 || skin == 30 || skin == 40 || skin == 50) { stc("#3You bounce their pathetic kick off your skin#n.\n\r",victim); stc("#3Your opponent bounces your kick off their skin#n.\n\r",ch); if (rebound == 10 || rebound == 30 || rebound == 50) { sprintf(buf,"#3The bounced kick slams into them#n. [#1%d#n]\n\r",dam / 2); stc(buf,victim); sprintf(buf,"#3Your kick bounces and slams into you#n. [#1%d#n]\n\r",dam / 2); stc(buf,ch); dam /= 2; damage( ch, ch, dam, gsn_kick ); } dam = 0; } } */ else damage (ch, victim, dam, gsn_kick); return; } int dambonus (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int stance) { if (dam < 1) return 0; if (stance < 1) return dam; if (!IS_NPC (ch) && !can_counter (victim)) { if (IS_STANCE (ch, STANCE_MONKEY)) { int mindam = dam * 0.25; dam *= (ch->stance[STANCE_MONKEY] + 1) / 200; if (dam < mindam) dam = mindam; } /* Tijer - Testing Something else if (IS_STANCE(ch, STANCE_BULL) && ch->stance[STANCE_BULL] > 100) dam += dam * (ch->stance[STANCE_BULL] / 100); else if (IS_STANCE(ch, STANCE_DRAGON) && ch->stance[STANCE_DRAGON] > 100) dam += dam * (ch->stance[STANCE_DRAGON] / 100); else if (IS_STANCE(ch, STANCE_TIGER) && ch->stance[STANCE_TIGER] > 100) dam += dam * (ch->stance[STANCE_TIGER] / 100); else if (ch->stance[0] > 0 && ch->stance[stance] < 100) dam *= 0.5; */ else if (IS_STANCE (ch, STANCE_BULL) && ch->stance[STANCE_BULL] > 100) dam += dam * (ch->stance[STANCE_BULL] * 0.01); else if (IS_STANCE (ch, STANCE_DRAGON) && ch->stance[STANCE_DRAGON] > 100) dam += dam * (ch->stance[STANCE_DRAGON] * 0.01); else if (IS_STANCE (ch, STANCE_TIGER) && ch->stance[STANCE_TIGER] > 100) dam += dam * (ch->stance[STANCE_TIGER] * 0.01); else if (ch->stance[0] > 0 && ch->stance[stance] < 100) dam *= 0.5; } if (!IS_NPC (victim) && !can_counter (ch)) { if (IS_STANCE (victim, STANCE_CRAB) && victim->stance[STANCE_CRAB] > 100) dam /= victim->stance[STANCE_CRAB] * 0.01; else if (IS_STANCE (victim, STANCE_DRAGON) && victim->stance[STANCE_DRAGON] > 100) dam /= victim->stance[STANCE_DRAGON] * 0.01; else if (IS_STANCE (victim, STANCE_SWALLOW) && victim->stance[STANCE_SWALLOW] > 100) dam /= victim->stance[STANCE_SWALLOW] * 0.01; /* if (IS_STANCE(victim, STANCE_CRAB) && victim->stance[STANCE_CRAB] > 100) dam /= victim->stance[STANCE_CRAB] / 100; else if (IS_STANCE(victim, STANCE_DRAGON) && victim->stance[STANCE_DRAGON] > 100) dam /= victim->stance[STANCE_DRAGON] / 100; else if (IS_STANCE(victim, STANCE_SWALLOW) && victim->stance[STANCE_SWALLOW] > 100) dam /= victim->stance[STANCE_SWALLOW] / 100; */ } return dam; } void do_punch (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int dam; bool broke = FALSE; one_argument (argument, arg); if (IS_NPC (ch)) return; if (ch->level < skill_table[gsn_punch].skill_level) { send_to_char ("First you should learn to punch.\n\r", ch); return; } if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_VAMPIRE)) do_majesty (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_FAE)) do_grandeur (ch, ""); if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("You aren't fighting anyone.\n\r", ch); return; } if (ch == victim) { send_to_char ("You cannot punch yourself!\n\r", ch); return; } if (is_safe (ch, victim)) return; if (victim->hit < victim->max_hit) { send_to_char ("They are hurt and suspicious.\n\r", ch); return; } if (victim->position < POS_FIGHTING) { send_to_char ("You can only punch someone who is standing.\n\r", ch); return; } if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_VAMPIRE)) do_majesty (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_FAE)) do_grandeur (ch, ""); act ("You draw your fist back and aim a punch at $N.", ch, NULL, victim, TO_CHAR); act ("$n draws $s fist back and aims a punch at you.", ch, NULL, victim, TO_VICT); act ("$n draws $s fist back and aims a punch at $N.", ch, NULL, victim, TO_NOTVICT); WAIT_STATE (ch, skill_table[gsn_punch].beats); if (IS_NPC (ch) || number_percent () < ch->pcdata->learned[gsn_punch]) dam = number_range (1, 4); else { dam = 0; damage (ch, victim, dam, gsn_punch); return; } dam += char_damroll (ch); if (dam == 0) dam = 1; if (!IS_AWAKE (victim)) dam *= 2; if (!IS_NPC (ch)) dam = dam + (dam * (ch->wpn[0] / 100)); if (dam <= 0) dam = 1; if ((!IS_NPC (victim) && IS_CLASS (victim, CLASS_WEREWOLF) && victim->pcdata->powers[WPOWER_BOAR] > 3) || IS_SUPER_NPC (victim)) { dam = 0; damage (ch, victim, dam, gsn_punch); if (number_percent () <= 25 && !IS_ARM_L (ch, LOST_ARM) && !IS_ARM_L (ch, LOST_HAND)) { if (!IS_ARM_L (ch, LOST_FINGER_I) && !IS_ARM_L (ch, BROKEN_FINGER_I)) { SET_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_I); broke = TRUE; } if (!IS_ARM_L (ch, LOST_FINGER_M) && !IS_ARM_L (ch, BROKEN_FINGER_M)) { SET_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_M); broke = TRUE; } if (!IS_ARM_L (ch, LOST_FINGER_R) && !IS_ARM_L (ch, BROKEN_FINGER_R)) { SET_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_R); broke = TRUE; } if (!IS_ARM_L (ch, LOST_FINGER_L) && !IS_ARM_L (ch, BROKEN_FINGER_L)) { SET_BIT (ch->loc_hp[LOC_ARM_L], BROKEN_FINGER_L); broke = TRUE; } if (broke) { act ("The fingers on your left hand shatter under the impact of the blow!", ch, NULL, NULL, TO_CHAR); act ("The fingers on $n's left hand shatter under the impact of the blow! ", ch, NULL, NULL, TO_ROOM); } } else if (number_percent () <= 25 && !IS_ARM_R (ch, LOST_ARM) && !IS_ARM_R (ch, LOST_HAND)) { if (!IS_ARM_R (ch, LOST_FINGER_I) && !IS_ARM_R (ch, BROKEN_FINGER_I)) { SET_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_I); broke = TRUE; } if (!IS_ARM_R (ch, LOST_FINGER_M) && !IS_ARM_R (ch, BROKEN_FINGER_M)) { SET_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_M); broke = TRUE; } if (!IS_ARM_R (ch, LOST_FINGER_R) && !IS_ARM_R (ch, BROKEN_FINGER_R)) { SET_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_R); broke = TRUE; } if (!IS_ARM_R (ch, LOST_FINGER_L) && !IS_ARM_R (ch, BROKEN_FINGER_L)) { SET_BIT (ch->loc_hp[LOC_ARM_R], BROKEN_FINGER_L); broke = TRUE; } if (broke) { act ("The fingers on your right hand shatter under the impact of the blow!", ch, NULL, NULL, TO_CHAR); act ("The fingers on $n's right hand shatter under the impact of the blow! ", ch, NULL, NULL, TO_ROOM); } } stop_fighting (victim, TRUE); return; } damage (ch, victim, dam, gsn_punch); if (victim == NULL || victim->position == POS_DEAD || dam < 1) return; if (victim->position == POS_FIGHTING) stop_fighting (victim, TRUE); 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); } act ("You fall to the ground stunned!", victim, NULL, NULL, TO_CHAR); act ("$n falls to the ground stunned!", victim, NULL, NULL, TO_ROOM); victim->position = POS_STUNNED; return; } void do_berserk (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *vch; CHAR_DATA *vch_next; CHAR_DATA *mount; int number_hit = 0; argument = one_argument (argument, arg); if (IS_NPC (ch)) return; if (ch->level < skill_table[gsn_berserk].skill_level) { send_to_char ("You are not wild enough to go berserk.\n\r", ch); return; } if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_VAMPIRE)) do_majesty (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_FAE)) do_grandeur (ch, ""); WAIT_STATE (ch, (skill_table[gsn_berserk].beats / 2)); if (number_percent () > ch->pcdata->learned[gsn_berserk]) { act ("You rant and rave, but nothing much happens.", ch, NULL, NULL, TO_CHAR); act ("$n gets a wild look in $s eyes, but nothing much happens.", ch, NULL, NULL, TO_ROOM); return; } act ("You go BERSERK!", ch, NULL, NULL, TO_CHAR); act ("$n goes BERSERK!", ch, NULL, NULL, TO_ROOM); if (ch->fighting == NULL) autodrop (ch); for (vch = char_list; vch != NULL; vch = vch_next) { vch_next = vch->next; if (number_hit > 4) continue; if (is_same_group (ch, vch)) continue; if (vch->in_room == NULL) continue; if (!IS_NPC (vch) && vch->pcdata->chobj != NULL) continue; if (ch == vch) continue; if (ch->in_room != vch->in_room) continue; if (vch->in_room != ch->in_room) continue; if (vch->in_room == ch->in_room) { if ((mount = ch->mount) != NULL) { if (mount == vch) continue; } if (can_see (ch, vch)) { /* Autostancing - Loki if (!IS_NPC (vch) && IS_SET (vch->extra, EXTRA_STANCE)) { if (vch->stance[11] == STANCE_VIPER) do_stance (vch, "viper"); else if (vch->stance[11] == STANCE_CRANE) do_stance (vch, "crane"); else if (vch->stance[11] == STANCE_CRAB) do_stance (vch, "crab"); else if (vch->stance[11] == STANCE_MONGOOSE) do_stance (vch, "mongoose"); else if (vch->stance[11] == STANCE_BULL) do_stance (vch, "bull"); else if (vch->stance[11] == STANCE_MANTIS) do_stance (vch, "mantis"); else if (vch->stance[11] == STANCE_DRAGON) do_stance (vch, "dragon"); else if (vch->stance[11] == STANCE_TIGER) do_stance (vch, "tiger"); else if (vch->stance[11] == STANCE_MONKEY) do_stance (vch, "monkey"); else if (vch->stance[11] == STANCE_SWALLOW) do_stance (vch, "swallow"); } */ //if (!IS_NPC (vch)) if (vch->fighting == NULL) autodrop (vch); multi_hit (ch, vch, TYPE_UNDEFINED); number_hit++; } } } } /* Hurl skill by KaVir */ void do_hurl (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; CHAR_DATA *mount; ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; char buf[MAX_INPUT_LENGTH]; char direction[MAX_INPUT_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int door; int rev_dir; int dam; argument = one_argument (argument, arg1); argument = one_argument (argument, arg2); if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_VAMPIRE)) do_majesty (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_FAE)) do_grandeur (ch, ""); if (!IS_NPC (ch) && ch->pcdata->learned[gsn_hurl] < 1) { send_to_char ("Maybe you should learn the skill first?\n\r", ch); return; } if (arg1[0] == '\0') { send_to_char ("Who do you wish to hurl?\n\r", ch); return; } if ((victim = get_char_room (ch, arg1)) == NULL) { send_to_char ("They are not here.\n\r", ch); return; } if (victim == ch) { send_to_char ("How can you hurl yourself?\n\r", ch); return; } if (is_safe (ch, victim)) return; if ((mount = victim->mount) != NULL && victim->mounted == IS_MOUNT) { send_to_char ("But they have someone on their back!\n\r", ch); return; } else if ((mount = victim->mount) != NULL && victim->mounted == IS_RIDING) { send_to_char ("But they are riding!\n\r", ch); return; } if (!is_garou (ch) || (is_garou (ch) && ch->gifts[UKTENA] < 5)) { if (!IS_NPC (victim) && IS_IMMUNE (victim, IMM_HURL)) { send_to_char ("You are unable to get their feet of the ground.\n\r", ch); return; } } if (!is_garou (ch) || (is_garou (ch) && ch->gifts[UKTENA] < 5)) { if (IS_NPC (victim) && victim->level > 900) { send_to_char ("You are unable to get their feet of the ground.\n\r", ch); return; } } if ((victim->hit < victim->max_hit) || (victim->position == POS_FIGHTING && victim->fighting != ch)) { act ("$N is hurt and suspicious, and you are unable to approach $M.", ch, NULL, victim, TO_CHAR); return; } WAIT_STATE (ch, skill_table[gsn_hurl].beats); if (!IS_NPC (ch) && number_percent () > ch->pcdata->learned[gsn_hurl]) { send_to_char ("You are unable to get their feet of the ground.\n\r", ch); multi_hit (victim, ch, TYPE_UNDEFINED); return; } rev_dir = 0; if (arg2[0] == '\0') door = number_range (0, 3); else { if (!str_cmp (arg2, "n") || !str_cmp (arg2, "north")) door = 0; else if (!str_cmp (arg2, "e") || !str_cmp (arg2, "east")) door = 1; else if (!str_cmp (arg2, "s") || !str_cmp (arg2, "south")) door = 2; else if (!str_cmp (arg2, "w") || !str_cmp (arg2, "west")) door = 3; else { send_to_char ("You can only hurl people north, south, east or west.\n\r", ch); return; } } if (door == 0) { sprintf (direction, "north"); rev_dir = 2; } if (door == 1) { sprintf (direction, "east"); rev_dir = 3; } if (door == 2) { sprintf (direction, "south"); rev_dir = 0; } if (door == 3) { sprintf (direction, "west"); rev_dir = 1; } if ((pexit = ch->in_room->exit[door]) == NULL || (to_room = pexit->to_room) == NULL) { sprintf (buf, "$n hurls $N into the %s wall.", direction); act (buf, ch, NULL, victim, TO_NOTVICT); sprintf (buf, "You hurl $N into the %s wall.", direction); act (buf, ch, NULL, victim, TO_CHAR); sprintf (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 (victim->position == POS_DEAD) { raw_kill (victim, ch); victim->form = 16; return; } return; } pexit = victim->in_room->exit[door]; if (IS_SET (pexit->exit_info, EX_CLOSED) && !IS_AFFECTED (victim, AFF_PASS_DOOR) && !IS_AFFECTED (victim, AFF_ETHEREAL)) { if (IS_SET (pexit->exit_info, EX_LOCKED)) REMOVE_BIT (pexit->exit_info, EX_LOCKED); if (IS_SET (pexit->exit_info, EX_CLOSED)) REMOVE_BIT (pexit->exit_info, EX_CLOSED); sprintf (buf, "$n hoists $N in the air and hurls $M %s.", direction); act (buf, ch, NULL, victim, TO_NOTVICT); sprintf (buf, "You hoist $N in the air and hurl $M %s.", direction); act (buf, ch, NULL, victim, TO_CHAR); sprintf (buf, "$n hurls you %s, smashing you through the %s.", direction, pexit->keyword); act (buf, ch, NULL, victim, TO_VICT); sprintf (buf, "There is a loud crash as $n smashes through the $d."); act (buf, victim, NULL, pexit->keyword, TO_ROOM); if ((to_room = pexit->to_room) != NULL && (pexit_rev = to_room->exit[rev_dir]) != NULL && pexit_rev->to_room == ch->in_room && pexit_rev->keyword != NULL) { if (IS_SET (pexit_rev->exit_info, EX_LOCKED)) REMOVE_BIT (pexit_rev->exit_info, EX_LOCKED); if (IS_SET (pexit_rev->exit_info, EX_CLOSED)) REMOVE_BIT (pexit_rev->exit_info, EX_CLOSED); if (door == 0) sprintf (direction, "south"); if (door == 1) sprintf (direction, "west"); if (door == 2) sprintf (direction, "north"); if (door == 3) sprintf (direction, "east"); char_from_room (victim); char_to_room (victim, to_room); sprintf (buf, "$n comes smashing in through the %s $d.", direction); act (buf, victim, NULL, pexit->keyword, TO_ROOM); dam = number_range (ch->level, (ch->level * 6)); victim->hit = victim->hit - dam; update_pos (victim); if (victim->position == POS_DEAD) { raw_kill (victim, ch); victim->form = 16; return; } } } else { sprintf (buf, "$n hurls $N %s.", direction); act (buf, ch, NULL, victim, TO_NOTVICT); sprintf (buf, "You hurl $N %s.", direction); act (buf, ch, NULL, victim, TO_CHAR); sprintf (buf, "$n hurls you %s.", direction); act (buf, ch, NULL, victim, TO_VICT); if (door == 0) sprintf (direction, "south"); if (door == 1) sprintf (direction, "west"); if (door == 2) sprintf (direction, "north"); if (door == 3) sprintf (direction, "east"); char_from_room (victim); char_to_room (victim, to_room); sprintf (buf, "$n comes 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 (victim->position == POS_DEAD) { raw_kill (victim, ch); victim->form = 16; return; } } return; } void do_disarm (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *obj; int percent; if (!IS_NPC (ch) && ch->level < skill_table[gsn_disarm].skill_level) { send_to_char ("You don't know how to disarm opponents.\n\r", ch); return; } if ((get_eq_char (ch, WEAR_WIELD) == NULL) && (get_eq_char (ch, WEAR_HOLD) == NULL) && (get_eq_char (ch, WEAR_DUAL) == NULL)) { send_to_char ("You must wield a weapon to disarm.\n\r", ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char ("You aren't fighting anyone.\n\r", ch); return; } if (((obj = get_eq_char (victim, WEAR_WIELD)) == NULL) && ((obj = get_eq_char (victim, WEAR_HOLD)) == NULL) && ((obj = get_eq_char (victim, WEAR_DUAL)) == NULL)) { send_to_char ("Your opponent is not wielding a weapon.\n\r", ch); return; } WAIT_STATE (ch, skill_table[gsn_disarm].beats); percent = number_percent () + victim->level - ch->level; if (!IS_NPC (victim) && IS_IMMUNE (victim, IMM_DISARM)) send_to_char ("You failed.\n\r", ch); else if (IS_NPC (ch) || percent < ch->pcdata->learned[gsn_disarm] * 2 / 3) disarm (ch, victim); else send_to_char ("You failed.\n\r", ch); return; } void do_sla (CHAR_DATA * ch, char *argument) { send_to_char ("If you want to SLAY, spell it out.\n\r", ch); return; } void do_slay (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Slay whom?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (ch == victim) { send_to_char ("Suicide is a mortal sin.\n\r", ch); } if (IS_SET (victim->act, PLR_GODLESS)) { send_to_char ("You failed.\n\r", ch); return; } if (IS_NPC (victim) && IS_SET (victim->act, ACT_NO_KILL)) { stc ("That Mobile is a QUEST MOB!!\n\r", ch); return; } if (!IS_NPC (victim) && victim->level >= ch->level && ch != victim) { send_to_char ("You failed.\n\r", ch); return; } act ("You slay $M in cold blood!", ch, NULL, victim, TO_CHAR); act ("$n slays you in cold blood!", ch, NULL, victim, TO_VICT); act ("$n slays $N in cold blood!", ch, NULL, victim, TO_NOTVICT); victim->form = 18; raw_kill (victim, ch); return; } /* Had problems with people not dying when POS_DEAD...KaVir */ void do_killperson (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; one_argument (argument, arg); if (arg[0] == '\0') return; if ((victim = get_char_room (ch, arg)) == NULL) return; send_to_char ("You have been KILLED!!\n\r\n\r", victim); raw_kill (victim, ch); return; } void do_diabkill (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; one_argument (argument, arg); if (arg[0] == '\0') return; if ((victim = get_char_room (ch, arg)) == NULL) return; send_to_char ("You have been Diablerised!!\n\r\n\r", victim); raw_kill (victim, ch); ch->pcdata->condition[COND_THIRST] = COND_FULL; return; } int souls_needed (CHAR_DATA * ch) { int souls; souls = (ch->pcdata->stats[UNI_GEN] + 1) * 5; return souls; } void do_soulsteal (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_DEMON)) { stc ("Huh?\n\r", ch); return; } if (is_inarena (ch)) { stc ("Not while in the arena!\n\r", ch); return; } if (arg[0] == '\0') { send_to_char ("Who's soul are you going to steal?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_CLASS (victim, CLASS_DEMON)) { stc ("Demons don't have a soul!\n\r", ch); return; } if (ch == victim) { send_to_char ("That might be a bit tricky...\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("You can only steal the soul of other players.\n\r", ch); return; } if (!CAN_PK (ch)) { send_to_char ("You must be an avatar to steal someone's soul.\n\r", ch); return; } if (!CAN_PK (victim)) { send_to_char ("You can only steal the soul of other Avatars.\n\r", ch); return; } if (victim->position > 1) { send_to_char ("You can only do this to mortally wounded players.\n\r", ch); return; } if (is_safe (ch, victim)) return; if (IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING)) { stc ("Leave people in the war alone!\n\r", ch); return; } if (IS_SET (ch->war, WARRING)) { stc ("Not while in a war!\n\r", ch); return; } if ((get_hours (ch) < 10) && ch->race == 0 && !IS_SET (ch->extra2, PKREADY)) { send_to_char ("You cannot soulsteal players yet.", ch); return; } if ((get_hours (victim) < 10) && victim->race == 0 && !IS_SET (victim->extra2, PKREADY)) { send_to_char ("You may not soulsteal a newbie!\n\r", ch); sprintf (buf, "%s has felt the wrath of the gods for newbie killing!", ch->name); do_restore (victim, victim->name); do_paradox (ch, "self"); SET_BIT (ch->newbits, WANTED); do_info (ch, buf); return; } act ("You tear $N's soul out of their body!", ch, NULL, victim, TO_CHAR); send_to_char ("Your soul is torn from your body!\n\r", victim); act ("$n tears $N's soul out of $S lifeless body!", ch, NULL, victim, TO_NOTVICT); act ("$n's soul is torn from $s body!", victim, NULL, NULL, TO_ROOM); victim->hit = 1; victim->fight_timer = 0; update_pos (victim); WAIT_STATE (ch, 12); char_from_room (victim); char_to_room (victim, get_room_index (ROOM_VNUM_ALTAR)); if (IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); if ((IS_CLASS (ch, CLASS_DROW) || (IS_CLASS(ch, CLASS_FAE) && IS_KITH (ch, KITH_SLUAGH))) && IS_SET (ch->newbits, NEW_DARKNESS)) REMOVE_BIT (ch->newbits, NEW_DARKNESS); ch->fight_timer = 10; ch->pcdata->souls++; if (ch->pcdata->souls >= souls_needed (ch)) stc ("You have achieved the required souls for a promotion!\n\r", ch); if (IS_CLASS (victim, CLASS_VAMPIRE)) do_mortalvamp (victim, ""); else if (IS_SET (victim->special, SPC_WOLFMAN)) do_unwerewolf (victim, ""); if (IS_CLASS (victim, CLASS_MAGE) && IS_AFFECTED (victim, AFF_POLYMORPH)) do_unpolymorph (victim, ""); /* free_string(victim->pcdata->decapped); victim->pcdata->decapped = str_dup(ch->name); free_string(victim->pcdata->decappedby); victim->pcdata->decappedby = str_dup(ch->name); */ victim->pcdata->stats[UNI_RAGE] = 0; sprintf (buf, "#r%s#w has just had a part of their soul stolen by #r%s!", victim->name, ch->name); do_fatality (ch, buf); sprintf (log_buf, "%s soulstolen by %s at %d.", victim->name, ch->name, victim->in_room->vnum); log_string (log_buf, ch); if (!IS_SET (ch->newbits, WANTED)) SET_BIT (ch->newbits, WANTED); return; } void do_dgourge (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_DRAGON)) { stc ("Huh?\n\r", ch); return; } if (is_inarena (ch)) { stc ("Not while in the arena!\n\r", ch); return; } if (arg[0] == '\0') { send_to_char ("Who do you wish to gourge on?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (ch == victim) { send_to_char ("That might be a bit tricky...\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("You can only steal the soul of other players.\n\r", ch); return; } if (!CAN_PK (ch)) { send_to_char ("You must be an avatar to steal someone's soul.\n\r", ch); return; } if (!CAN_PK (victim)) { send_to_char ("You can only steal the soul of other Avatars.\n\r", ch); return; } if (victim->position > 1) { send_to_char ("You can only do this to mortally wounded players.\n\r", ch); return; } if (is_safe (ch, victim)) return; if (IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING)) { stc ("Leave people in the war alone!\n\r", ch); return; } if (IS_SET (ch->war, WARRING)) { stc ("Not while in a war!\n\r", ch); return; } if ((get_hours (ch) < 10) && ch->race == 0 && !IS_SET (ch->extra2, PKREADY)) { send_to_char ("You cannot gourge on players yet.", ch); return; } if ((get_hours (victim) < 10) && victim->race == 0 && !IS_SET (victim->extra2, PKREADY)) { send_to_char ("You may not gourge on a newbie!\n\r", ch); sprintf (buf, "%s has felt the wrath of the gods for newbie killing!", ch->name); do_restore (victim, victim->name); do_paradox (ch, "self"); SET_BIT (ch->newbits, WANTED); do_info (ch, buf); return; } act ("You feed on $N's life force!", ch, NULL, victim, TO_CHAR); send_to_char ("You feel your life force being drained from your body!\n\r", victim); act ("$n feeds on $N's life force and drains is out of $S body!", ch, NULL, victim, TO_NOTVICT); act ("$n's life is drained from $s body!", victim, NULL, NULL, TO_ROOM); victim->hit = 1; update_pos (victim); victim->fight_timer = 0; WAIT_STATE (ch, 12); char_from_room (victim); char_to_room (victim, get_room_index (ROOM_VNUM_ALTAR)); if (IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); if ((IS_CLASS (ch, CLASS_DROW) || (IS_CLASS(ch, CLASS_FAE) && IS_KITH (ch, KITH_SLUAGH))) && IS_SET (ch->newbits, NEW_DARKNESS)) REMOVE_BIT (ch->newbits, NEW_DARKNESS); ch->fight_timer = 10; ch->pcdata->condition[COND_FULL] = 24000; //ch->pkill = ch->pkill + 1; //victim->pdeath = victim->pdeath + 1; if (IS_CLASS (victim, CLASS_VAMPIRE)) do_mortalvamp (victim, ""); else if (IS_SET (victim->special, SPC_WOLFMAN)) do_unwerewolf (victim, ""); if (IS_CLASS (victim, CLASS_MAGE) && IS_AFFECTED (victim, AFF_POLYMORPH)) do_unpolymorph (victim, ""); victim->pcdata->stats[UNI_RAGE] = 0; sprintf (buf, "#r%s #whas fed on the lifeforce of #r%s!#n", ch->name, victim->name); do_fatality (ch, buf); sprintf (log_buf, "%s gourged by %s at %d.", victim->name, ch->name, victim->in_room->vnum); log_string (log_buf, ch); return; } void do_psac (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (is_inarena (ch)) { stc ("Not while in the arena!\n\r", ch); return; } if (arg[0] == '\0') { send_to_char ("Who do you wish to sacrifice to the gods?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (ch == victim) { send_to_char ("That might be a bit tricky...\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("You can only sacrifice other players.\n\r", ch); return; } if (!CAN_PK (ch)) { send_to_char ("You must be an avatar to sacrifice players to the gods.\n\r", ch); return; } if (!CAN_PK (victim)) { send_to_char ("You can only sacrifice other Avatars.\n\r", ch); return; } if (victim->position > 1) { send_to_char ("You can only do this to mortally wounded players.\n\r", ch); return; } if (is_safe (ch, victim)) return; if (IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING)) { stc ("Leave people in the war alone!\n\r", ch); return; } if (IS_SET (ch->war, WARRING)) { stc ("Not while in a war!\n\r", ch); return; } if ((get_hours (ch) < 10) && ch->race == 0 && !IS_SET (ch->extra2, PKREADY)) { send_to_char ("You cannot sacrifice on players yet.", ch); return; } if ((get_hours (victim) < 10) && victim->race == 0 && !IS_SET (victim->extra2, PKREADY)) { send_to_char ("You may not gourge on a newbie!\n\r", ch); sprintf (buf, "%s has felt the wrath of the gods for newbie killing!", ch->name); do_restore (victim, victim->name); do_paradox (ch, "self"); SET_BIT (ch->newbits, WANTED); do_info (ch, buf); return; } act ("You sacrifice $N to the gods!", ch, NULL, victim, TO_CHAR); send_to_char ("You have been sacrificed to the gods!\n\r", victim); act ("$n sacrifices $N to the gods", ch, NULL, victim, TO_NOTVICT); act ("$n has been sacrified to the gods!", victim, NULL, NULL, TO_ROOM); victim->hit = victim->max_hit; update_pos (victim); victim->fight_timer = 0; WAIT_STATE (ch, 12); char_from_room (victim); char_to_room (victim, get_room_index (ROOM_VNUM_ALTAR)); if (IS_SET (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS)) REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); if ((IS_CLASS (ch, CLASS_DROW) || (IS_CLASS(ch, CLASS_FAE) && IS_KITH (ch, KITH_SLUAGH))) && IS_SET (ch->newbits, NEW_DARKNESS)) REMOVE_BIT (ch->newbits, NEW_DARKNESS); ch->fight_timer = 10; if (IS_CLASS (victim, CLASS_VAMPIRE)) do_mortalvamp (victim, ""); else if (IS_SET (victim->special, SPC_WOLFMAN)) do_unwerewolf (victim, ""); if (IS_CLASS (victim, CLASS_MAGE) && IS_AFFECTED (victim, AFF_POLYMORPH)) do_unpolymorph (victim, ""); victim->pcdata->pkill_timer += 120; victim->pcdata->login_timer += 180; victim->pcdata->stats[UNI_RAGE] = 0; sprintf (buf, "#r%s #whas sacrificed #r%s #wto the gods!#n", ch->name, victim->name); do_fatality (ch, buf); sprintf (log_buf, "%s sacrificed by %s at %d.", victim->name, ch->name, victim->in_room->vnum); log_string (log_buf, ch); return; } /* Gen Stealing is in - Matthew */ void do_gensteal (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MIL]; char buf[MSL]; if (!IS_NPC(ch) && IS_CLASS(ch, CLASS_VAMPIRE)) { do_diablerise(ch, argument); return; } one_argument (argument, arg); if (IS_NPC (ch)) return; if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_VAMPIRE)) do_majesty (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_FAE)) do_grandeur (ch, ""); if (arg[0] == '\0') { send_to_char ("Steal whos generation?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("Not on a mobile.\n\r", ch); return; } if (IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING)) { stc ("Leave people in the war alone!\n\r", ch); return; } if (IS_SET (ch->war, WARRING)) { stc ("Not while in a war!\n\r", ch); return; } if (is_inarena (ch)) return; if (ch == victim) { send_to_char ("That might be a bit tricky...\n\r", ch); return; } if (ch->pcdata->pkill_timer > 0) { stc ("You are unable to steal their generation with a safe timer\n\r", ch); return; } if (victim->pcdata->pkill_timer > 0) { stc ("You are unable to steal their generation.\n\r", ch); return; } if (IS_NEWBIE (victim) && !IS_SET (victim->extra2, PKREADY)) { stc ("You are unable to steal newbies generations.\n\r", ch); return; } if (IS_CREATOR (victim)) { stc ("You failed|\n\r", ch); return; } if (!CAN_PK (ch)) { send_to_char ("You must be an avatar to steal someones generation.\n\r", ch); return; } if (!CAN_PK (victim)) { send_to_char ("You can only steal generations from other avatars.\n\r", ch); return; } if (victim->position > 1) { send_to_char ("You can only do this to mortally wounded players.\n\r", ch); return; } if (ch->pcdata->stats[UNI_GEN] == 2) { stc ("You have the lowest possible gen!\n\r", ch); return; } if (ch->pcdata->stats[UNI_GEN] < victim->pcdata->stats[UNI_GEN]) { stc ("Your generation is lower than theirs already!\n\r", ch); return; } if (victim->pcdata->stats[UNI_GEN] == 13) { stc ("Their generation is worthless to you!\n\r", ch); return; } if (ch->class != victim->class) { stc ("You can only steal generations from your own class.\n\r", ch); return; } if (victim->pcdata->stats[UNI_GEN] == 1) { stc ("They are too powerful!\n\r", ch); return; } if (is_safe (ch, victim)) return; if ((get_hours (victim) < 10) && victim->race == 0 && !IS_SET (victim->extra2, PKREADY)) { send_to_char ("You may not gensteal a newbie!\n\r", ch); sprintf (buf, "%s has felt the wrath of the gods for newbie killing!", ch->name); do_restore (victim, victim->name); do_paradox (ch, "self"); SET_BIT (ch->newbits, WANTED); do_info (ch, buf); return; } act ("Lightning arcs from the sky and through your body as you steal the powers of $N.\n\r", ch, NULL, victim, TO_CHAR); act ("$n puts his hands on $N's head and lightning shoots through $s body.\n\r", ch, NULL, victim, TO_NOTVICT); send_to_char ("Your generation has been stolen.\n\r", victim); sprintf (buf, "%s has beaten %s and stolen their generation!", ch->name, victim->name); do_fatality (ch, buf); sprintf (log_buf, "%s genstolen by %s at %d.", victim->name, ch->name, victim->in_room->vnum); log_string (log_buf, ch); ch->pcdata->stats[UNI_GEN]--; victim->pcdata->stats[UNI_GEN]++; victim->hit = 1; victim->fight_timer = 0; update_pos (victim); WAIT_STATE (ch, 12); char_from_room (victim); char_to_room (victim, get_room_index (ROOM_VNUM_ALTAR)); if (!IS_SET (ch->newbits, WANTED)) SET_BIT (ch->newbits, WANTED); return; } OBJ_DATA *ch_weapon (CHAR_DATA * ch, bool right_hand) { OBJ_DATA *wpn1 = NULL, *wpn2 = NULL; wpn1 = get_eq_char (ch, WEAR_WIELD); wpn2 = get_eq_char (ch, WEAR_HOLD); if (wpn1 == NULL) wpn1 = get_eq_char (ch, WEAR_DUAL); if (wpn1 == NULL || wpn1->item_type != ITEM_WEAPON) wpn1 = NULL; if (wpn2 == NULL || wpn2->item_type != ITEM_WEAPON) wpn2 = NULL; if (!wpn2) return wpn1; if (!wpn1) return wpn2; if (right_hand) return wpn1; else return wpn2; } /* For decapitating players - KaVir */ void do_decapitate (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *obj; OBJ_DATA *obj_next; // OBJ_DATA *obj2; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; char wanted[MSL]; char paradoxlog[MSL]; one_argument (argument, arg); bool ARTI = FALSE; if (IS_NPC (ch)) return; if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_VAMPIRE)) do_majesty (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_FAE)) do_grandeur (ch, ""); if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); /* obj2 = get_eq_char (ch, WEAR_HOLD); if ((obj = get_eq_char (ch, WEAR_WIELD)) == NULL) { if ((obj2 = get_eq_char (ch, WEAR_HOLD)) == NULL) { if ((obj2 = get_eq_char (ch, WEAR_DUAL)) == NULL) { send_to_char ("First you better get a weapon out!\n\r", ch); return; } } } */ obj = ch_weapon( ch, FALSE ); if (!obj) { send_to_char( "First you better get a weapon out!\n\r", ch ); return; } /* if ((obj != NULL && obj->item_type != ITEM_WEAPON)) { if ((obj2 != NULL && obj2->item_type != ITEM_WEAPON)) { send_to_char ("But you are not wielding any weapons!\n\r", ch); return; } } Stupid code this if ( ( obj != NULL && obj->value[3] != 1 && obj->value[3] != 3 ) && ( obj2 != NULL && obj2->value[3] != 1 && obj2->value[3] != 3 ) ) { send_to_char( "You need to wield a slashing or slicing weapon to decapitate.\n\r", ch ); return; } */ if (arg[0] == '\0') { send_to_char ("Decapitate whom?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("You can only decapitate other players.\n\r", ch); return; } if (IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING)) { stc ("Leave people in the war alone!\n\r", ch); return; } if (IS_SET (ch->war, WARRING)) { stc ("Not while in a war!\n\r", ch); return; } if (ch == victim) { send_to_char ("That might be a bit tricky...\n\r", ch); return; } if (IS_NEWBIE (victim)) { stc ("You are unable to Decapitate Newbies.\n\r", ch); return; } if (IS_SET (victim->in_room->room_flags, ROOM_NODECAP) && !nosafe && victim->fight_timer == 0) { send_to_char ("The intense magic of the room, stops you from decapitating.\n\r", ch); return; } if (ch->pcdata->pkill_timer > 0) { stc ("You are unable to decapitate with a safe timer\n\r", ch); return; } if (victim->pcdata->pkill_timer > 0) { stc ("You are unable to decap people with safe timers.\n\r", ch); return; } if (IS_CREATOR (victim)) { stc ("You failed|\n\r", ch); return; } /* buf2 = ch->race * (ch->race - victim->race) * 50; if (((ch->race - victim->race) > WizConfig->paradoxlimit && victim->race < 50) && ch->max_hit < ch->race * (ch->race - victim->race) * 50 + buf2) { send_to_char("You don't have enough hitpoints to do this. You might get flicked for this. \n\r" " You need the amount of hps you'll be flicked for.\n\r",ch); return; } */ if (!CAN_PK (ch)) { send_to_char ("You must be an avatar to decapitate someone.\n\r", ch); return; } if (!CAN_PK (victim)) { send_to_char ("You can only decapitate other avatars.\n\r", ch); return; } if (victim->position > 1) { send_to_char ("You can only do this to mortally wounded players.\n\r", ch); return; } if (is_safe (ch, victim)) return; if ((get_hours (ch) < 10) && ch->race == 0 && !IS_SET (ch->extra2, PKREADY)) { send_to_char ("You cannot decapitate players yet.", ch); return; } if ((get_hours (victim) < 10) && victim->race == 0 && !IS_SET (victim->extra2, PKREADY)) { send_to_char ("You may not 'cap a newbie!\n\r", ch); sprintf (buf, "%s has felt the wrath of the gods for newbie killing!", ch->name); do_restore (victim, victim->name); do_paradox (ch, "self"); SET_BIT (ch->newbits, WANTED); do_info (ch, wanted); return; } if (ch != victim && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF(ch, VAM_MORTAL)) && IS_SET (ch->special, SPC_INCONNU) && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF (victim, VAM_MORTAL))) { send_to_char ("You cannot decapitate another vampire.\n\r", ch); return; } if (ch != victim && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF(victim, VAM_MORTAL)) && IS_SET (victim->special, SPC_INCONNU) && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF (ch, VAM_MORTAL))) { send_to_char ("You cannot decapitate a member of the Inconnu.\n\r", ch); return; } //WANTEDD if (victim->in_room->vnum >= 3000 && victim->in_room->vnum <= 3373 && !nosafe && !IS_SET (victim->newbits, WANTED)) { stc ("You decapitated in Midgarrd, you are now wanted.\n\r", ch); SET_BIT (ch->newbits, WANTED); sprintf (wanted, "%s is now wanted!!", ch->name); do_info (ch, wanted); } act ("You bring your weapon down upon $N's neck!", ch, NULL, victim, TO_CHAR); send_to_char ("Your head is sliced from your shoulders!\n\r", victim); act ("$n swings $s weapon down towards $N's neck!", ch, NULL, victim, TO_NOTVICT); act ("$n's head is sliced from $s shoulders!", victim, NULL, NULL, TO_ROOM); if ((IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION)) && !IS_CLASS (victim, CLASS_DEMON) && !IS_SET (victim->special, SPC_CHAMPION) && !IS_CLASS (ch, CLASS_DROW)) { if (ch->race == 0 && victim->race == 0) { ch->pcdata->stats[DEMON_CURRENT] += 1000; ch->pcdata->stats[DEMON_TOTAL] += 1000; } else { ch->pcdata->stats[DEMON_CURRENT] += victim->race * 1000; ch->pcdata->stats[DEMON_TOTAL] += victim->race * 1000; } } if (IS_CLASS (ch, CLASS_DROW) && !IS_CLASS (victim, CLASS_DEMON) && !IS_CLASS (victim, CLASS_DROW)) { if (victim->race == 0 && ch->race == 0) ch->pcdata->stats[DROW_POWER] += 1000; else ch->pcdata->stats[DROW_POWER] += 1000 * victim->race; } if ( victim->clannum > 0 && victim->clannum != ch->clannum) { if( ch->clannum == 0 ) { sprintf(buf, "#r%s#7 has been decapitated by #r%s#7! Avenge your fellow clanmember's death!", victim->name, ch->name); do_claninfo(victim, buf); nclans_table[victim->clannum].retalclan = str_dup( ch->name ); } else { sprintf(buf, "#r%s#7 has been decapitated by #r%s#7, from the #r%s#7 clan! Avenge your fellow clanmember's death!", victim->name, ch->name, nclans_table[ch->clannum].name); do_claninfo(victim, buf); nclans_table[victim->clannum].retalclan = str_dup( nclans_table[ch->clannum].name ); } } if( ch->clannum != victim->clannum ) { nclans_table[ch->clannum].pks++; save_clans(); } if( victim->clannum != ch->clannum ) { nclans_table[victim->clannum].pds++; save_clans(); } if (victim->pcdata->bounty > 0) { ch->pcdata->quest += victim->pcdata->bounty; sprintf (buf, "%s has taken the %dQp bounty of %s's head", ch->name, victim->pcdata->bounty, victim->name); do_info (ch, buf); victim->pcdata->bounty = 0; send_to_char ("You receive your reward.\n\r", ch); } if ((((ch->race - victim->race) > WizConfig->paradoxlimit) && victim->race < 50 && (ch->race > 0)) || ((victim->race < 1) && (ch->race > 0))) { for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (IS_SET (obj->quest, QUEST_ARTIFACT)) ARTI = TRUE; } if (!nosafe && !ARTI) { ch->paradox[0] += ch->race; ch->paradox[1] += ch->race; ch->paradox[2] += PARADOX_TICK; sprintf (paradoxlog, "%s now has %d paradox.", ch->name, ch->paradox[1]); wiznet (ch, WIZ_DEATHS, 7, paradoxlog); } { char *temp = 0; do_fatality (ch, mdecapmsg (temp, ch, victim)); } sprintf (buf, "%s received no status.", ch->name); do_fatality (ch, buf); if (ch->hit == ch->max_hit) do_fatality(ch, "FLAWLESS VICTORY!!"); sprintf (log_buf, "%s decapitated by %s at %d for no status.", victim->name, ch->name, ch->in_room->vnum); log_string (log_buf, ch); wiznet (ch, WIZ_DEATHS, 7, log_buf); WizConfig->totaldecaps++; save_wizconfig (); /* if (!nosafe) { if (number_range(1,3) == 3) { sprintf( buf, "%s is flicked for %d hps!", ch->name, ch->race * (ch->race - victim->race) * 50 + buf2); do_info(ch, buf); ch->max_hit -= ch->race * (ch->race - victim->race) * 50 + buf2; if (ch->max_hit < 1) { ch->max_hit = 500; } } } */ if (IS_CLASS (ch, CLASS_HIGHLANDER) && victim->class == CLASS_HIGHLANDER) { int quick_gain = 0; ch->quickening[1] += 2; quick_gain = victim->quickening[1]; if (quick_gain > 3) quick_gain = 3; ch->quickening[1] += quick_gain; victim->quickening[1] -= quick_gain; victim->quickening[0] = 0; sprintf (buf, "In the end there can be ONLY one!"); do_info (ch, buf); stc ("You drain some of their quickening\n\r", ch); stc ("They drain some of your quickening.\n\r", victim); if (!nosafe && !ARTI && ((((ch->race - victim->race) > WizConfig->paradoxlimit) && victim->race < 50 && (ch->race > 0)) || ((victim->race < 1) && (ch->race > 0))) && ch->lstatus > victim->lstatus) { ch->paradox[0] += ch->lstatus - victim->lstatus; ch->paradox[1] += ch->lstatus - victim->lstatus; ch->paradox[2] += PARADOX_TICK; sprintf (paradoxlog, "%s now has %d paradox.", ch->name, ch->paradox[1]); wiznet (ch, WIZ_DEATHS, 7, paradoxlog); } } if (victim->disquiet_counter > 0) victim->disquiet_counter = 0; if (IS_SET(victim->newbits, NEW_CALM)) REMOVE_BIT (victim->newbits, NEW_CALM); if (IS_CLASS (victim, CLASS_VAMPIRE)) { if (IS_EXTRA (victim, EXTRA_DRAGON)) { REMOVE_BIT(victim->extra,EXTRA_DRAGON); free_string(victim->morph); victim->morph = str_dup(""); } if (IS_POLYAFF (victim, POLY_ZULO)) { REMOVE_BIT(victim->polyaff, POLY_ZULO); free_string(victim->morph); victim->morph = str_dup(""); } if (IS_SET (victim->affected_by, AFF_POLYMORPH)) REMOVE_BIT (victim->affected_by, AFF_POLYMORPH); if (IS_SET (victim->flag2, VAMP_OBJMASK)) { stc ("You return to your normal form.\n\r", victim); sprintf (buf, "%s transforms back into %s.\n\r", victim->morph, victim->name); act (buf, victim, NULL, NULL, TO_ROOM); free_string (victim->morph); victim->morph = str_dup (""); free_string (victim->objdesc); victim->objdesc = str_dup (""); free_string (victim->long_descr); victim->long_descr = str_dup (""); free_string (victim->short_descr); victim->short_descr = str_dup (victim->name); REMOVE_BIT (victim->flag2, VAMP_OBJMASK); } //Mattpoint } if (IS_CLASS (victim, CLASS_VAMPIRE)) do_mortalvamp (victim, ""); else if (IS_SET (victim->special, SPC_WOLFMAN)) do_unwerewolf (victim, ""); if (IS_CLASS (victim, CLASS_MAGE) && IS_AFFECTED (victim, AFF_POLYMORPH)) do_unpolymorph (victim, ""); ch->fight_timer += 10; behead (victim); do_beastlike (ch, ""); ch->pkill = ch->pkill + 1; victim->pdeath = victim->pdeath + 1; victim->level = 2; if (IS_SET (victim->newbits, WANTED)) REMOVE_BIT (victim->newbits, WANTED); return; } if (IS_CLASS (ch, CLASS_HIGHLANDER) && victim->class == CLASS_HIGHLANDER) { int quick_gain = 0; ch->quickening[1] += 2; quick_gain = victim->quickening[1]; if (quick_gain > 3) quick_gain = 3; ch->quickening[1] += quick_gain; victim->quickening[1] -= quick_gain; victim->quickening[0] = 0; sprintf (buf, "In the end there can be ONLY one!"); do_info (ch, buf); stc ("You drain some of their quickening\n\r", ch); stc ("They drain some of your quickening.\n\r", victim); if (!nosafe && !ARTI && ((((ch->race - victim->race) > WizConfig->paradoxlimit) && victim->race < 50 && (ch->race > 0)) || ((victim->race < 1) && (ch->race > 0))) && ch->lstatus > victim->lstatus) { ch->paradox[0] += ch->lstatus - victim->lstatus; ch->paradox[1] += ch->lstatus - victim->lstatus; ch->paradox[2] += PARADOX_TICK; sprintf (paradoxlog, "%s now has %d paradox.", ch->name, ch->paradox[1]); wiznet (ch, WIZ_DEATHS, 7, paradoxlog); } } ch->exp = ch->exp + 1000; if (ch->race < 100) ch->race = ch->race + 1; if (victim->race > 0) victim->race = victim->race - 1; if (IS_CLASS (ch, CLASS_HIGHLANDER) && !IS_CLASS (victim, CLASS_HIGHLANDER)) { ch->quickening[1] += 3; stc ("You gain 3 quickening\n\r", ch); if (!nosafe && !ARTI && ((((ch->race - victim->race) > WizConfig->paradoxlimit) && victim->race < 50 && (ch->race > 0)) || ((victim->race < 1) && (ch->race > 0))) && ch->lstatus > victim->lstatus) { ch->paradox[0] += ch->lstatus - victim->lstatus; ch->paradox[1] += ch->lstatus - victim->lstatus; ch->paradox[2] += PARADOX_TICK; sprintf (paradoxlog, "%s now has %d paradox.", ch->name, ch->paradox[1]); wiznet (ch, WIZ_DEATHS, 7, paradoxlog); } } act ("A misty white vapour pours from $N's corpse into your body.", ch, NULL, victim, TO_CHAR); act ("A misty white vapour pours from $N's corpse into $n's body.", ch, NULL, victim, TO_NOTVICT); act ("You double over in agony as raw energy pulses through your veins.", ch, NULL, NULL, TO_CHAR); act ("$n doubles over in agony as sparks of energy crackle around $m.", ch, NULL, NULL, TO_NOTVICT); if (IS_CLASS (victim, CLASS_VAMPIRE)) do_mortalvamp (victim, ""); else if (IS_SET (victim->special, SPC_WOLFMAN)) do_unwerewolf (victim, ""); if (IS_CLASS (victim, CLASS_MAGE) && IS_AFFECTED (victim, AFF_POLYMORPH)) do_unpolymorph (victim, ""); ch->fight_timer += 10; behead (victim); do_beastlike (ch, ""); ch->pkill = ch->pkill + 1; victim->pdeath = victim->pdeath + 1; victim->pcdata->stats[UNI_RAGE] = 0; victim->level = 2; long long recexp = 0; recexp = victim->exp/2; if (!nosafe) { stcprintf (ch, "#w[You receive #r%lld #wexperience points]#n\n\r", recexp); ch->exp += recexp; victim->exp -= recexp; stcprintf (victim, "#w[You lose #r%lld #wexperience points]#n\n\r", recexp); } { char *temp = 0; do_fatality (ch, mdecapmsg (temp, ch, victim)); } if (ch->hit == ch->max_hit) do_fatality(ch, "FLAWLESS VICTORY!!"); if (IS_SET (ch->act, PLR_AUTOSAC)) do_sacrifice (ch, "head"); free_string (ch->pcdata->decapped); ch->pcdata->decapped = str_dup (victim->name); free_string (victim->pcdata->decappedby); victim->pcdata->decappedby = str_dup (ch->name); sprintf (log_buf, "%s decapitated by %s at %d.", victim->name, ch->name, ch->in_room->vnum); log_string (log_buf, ch); wiznet (ch, WIZ_DEATHS, 7, log_buf); victim->pcdata->pkill_timer = 30; WizConfig->totaldecaps++; save_wizconfig (); if (IS_CLASS (victim, CLASS_VAMPIRE)) { if (IS_EXTRA (victim, EXTRA_DRAGON)) { REMOVE_BIT(victim->extra,EXTRA_DRAGON); free_string(victim->morph); victim->morph = str_dup(""); } if (IS_POLYAFF (victim, POLY_ZULO)) { REMOVE_BIT(victim->polyaff, POLY_ZULO); free_string(victim->morph); victim->morph = str_dup(""); } if (IS_SET (victim->flag2, VAMP_OBJMASK)) { stc ("You return to your normal form.\n\r", victim); sprintf (buf, "%s transforms back into %s.\n\r", victim->morph, victim->name); act (buf, victim, NULL, NULL, TO_ROOM); free_string (victim->morph); victim->morph = str_dup (""); free_string (victim->objdesc); victim->objdesc = str_dup (""); free_string (victim->long_descr); victim->long_descr = str_dup (""); free_string (victim->short_descr); victim->short_descr = str_dup (victim->name); REMOVE_BIT (victim->flag2, VAMP_OBJMASK); } } if (ch->pkill + ch->pdeath != 0) { adjust_hiscore ("pkill", ch, ch->pkill); } if (victim->pkill + victim->pdeath != 0) { adjust_hiscore ("pkill", victim, victim->pkill); adjust_hiscore ("pdeath", victim, victim->pdeath); } return; } void do_tear (CHAR_DATA * ch, char *argument) { OBJ_DATA *obj; OBJ_DATA *obj_next; CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; char paradoxlog[MSL]; char wanted[MSL]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_WEREWOLF) && !IS_CLASS (ch, CLASS_MONK) && !IS_CLASS (ch, CLASS_DRAGON) && !IS_SET(ch->more, MORE_LIONSMANE) && !IS_VAMPAFF (ch, VAM_CLAWS)) { send_to_char ("Huh?\n\r", ch); return; } /* if (IS_SET (ch->in_room->room_flags, ROOM_NODECAP) && !nosafe ) { send_to_char ("The intense magic of the room, stops you from decapitating.\n\r", ch); return; } */ if (IS_SET (ch->extra2, AURA_NO_MAGIC)) do_auranomagic (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_VAMPIRE)) do_majesty (ch, ""); if (IS_AFFECTED (ch, AFF_STEELSHIELD) && IS_CLASS (ch, CLASS_FAE)) do_grandeur (ch, ""); if (!IS_SET (ch->special, SPC_WOLFMAN) && IS_CLASS (ch, CLASS_WEREWOLF)) { send_to_char ("You can only tear heads off while in Crinos form.\n\r", ch); return; } if (!IS_VAMPAFF (ch, VAM_CLAWS) && IS_CLASS (ch, CLASS_WEREWOLF)) { send_to_char ("You better get your claws out first.\n\r", ch); return; } if (arg[0] == '\0') { send_to_char ("Who's head do you wish to tear off?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("You can only tear the heads off other players.\n\r", ch); return; } if (ch == victim) { send_to_char ("That might be a bit tricky...\n\r", ch); return; } if (IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING)) { stc ("Leave people in the war alone!\n\r", ch); return; } if (IS_SET (ch->war, WARRING)) { stc ("Not while in a war!\n\r", ch); return; } if (IS_NEWBIE (victim)) { stc ("You are unable to Decapitate Newbies.\n\r", ch); return; } if (IS_CREATOR (victim)) { stc ("You failed!\n\r", ch); return; } if (IS_SET (victim->in_room->room_flags, ROOM_NODECAP) && !nosafe && victim->fight_timer == 0) { send_to_char ("The intense magic of the room, stops you from decapitating.\n\r", ch); return; } if (ch->pcdata->pkill_timer > 0) { stc ("You are unable to decapitate with a safe timer\n\r", ch); return; } if (victim->pcdata->pkill_timer > 0) { stc ("You are unable to decap people with safe timers.\n\r", ch); return; } /* buf2 = ch->race * (ch->race - victim->race) * 50; if (((ch->race - victim->race) > WizConfig->paradoxlimit && victim->race < 50) && ch->max_hit < ch->race * (ch->race - victim->race) * 50 + buf2) { send_to_char("You don't have enough hitpoints to do this. You might get flicked for this. \n\r" " You need the amount of hps you'll be flicked for.\n\r",ch); return; } */ if (!CAN_PK (ch)) { send_to_char ("You must be an avatar to tear someone's head off.\n\r", ch); return; } if (!CAN_PK (victim)) { send_to_char ("You can only tear the head off another avatar.\n\r", ch); return; } if (victim->position > 1) { send_to_char ("You can only do this to mortally wounded players.\n\r", ch); return; } if (is_safe (ch, victim)) return; if (get_hours (ch) < 10 && ch->race == 0 && !IS_SET (ch->extra2, PKREADY)) { send_to_char ("You cannot decapitate players yet.", ch); return; } if (get_hours (victim) < 10 && victim->race == 0 && !IS_SET (victim->extra2, PKREADY)) { send_to_char ("You may not 'cap a newbie!\n\r", ch); sprintf (buf, "%s has felt the wrath of the gods for newbie killing!", ch->name); do_restore (victim, victim->name); do_paradox (ch, "self"); SET_BIT (ch->newbits, WANTED); do_info (ch, buf); return; } if (victim->in_room->vnum >= 3000 && victim->in_room->vnum <= 3373 && !IS_SET (victim->newbits, WANTED) && !nosafe) { stc ("You decapitated in Midgarrd, you are now wanted.\n\r", ch); SET_BIT (ch->newbits, WANTED); sprintf (wanted, "%s is now wanted!!", ch->name); do_info (ch, wanted); } act ("You tear $N's head from $S shoulders!", ch, NULL, victim, TO_CHAR); send_to_char ("Your head is torn from your shoulders!\n\r", victim); act ("$n tears $N's head from $S shoulders!", ch, NULL, victim, TO_NOTVICT); if (IS_CLASS (ch, CLASS_DEMON) || IS_SET (ch->special, SPC_CHAMPION)) { if (ch->race == 0 && victim->race == 0) { ch->pcdata->stats[DEMON_CURRENT] += 1000; ch->pcdata->stats[DEMON_TOTAL] += 1000; } else { ch->pcdata->stats[DEMON_CURRENT] += victim->race * 1000; ch->pcdata->stats[DEMON_TOTAL] += victim->race * 1000; } } if ( victim->clannum > 0 && victim->clannum != ch->clannum ) { if( ch->clannum == 0 ) { sprintf(buf, "#r%s#7 has been decapitated by #r%s#7! Avenge your fellow clanmember's death!", victim->name, ch->name); do_claninfo(victim, buf); nclans_table[victim->clannum].retalclan = str_dup( ch->name ); } else { sprintf(buf, "#r%s#7 has been decapitated by #r%s#7, from the #r%s#7 clan! Avenge your fellow clanmember's death!", victim->name, ch->name, nclans_table[ch->clannum].name); do_claninfo(victim, buf); nclans_table[victim->clannum].retalclan = str_dup( nclans_table[ch->clannum].name ); } } if( ch->clannum != victim->clannum ) { nclans_table[ch->clannum].pks++; save_clans(); } if( victim->clannum != ch->clannum ) { nclans_table[victim->clannum].pds++; save_clans(); } if (victim->pcdata->bounty > 0) { ch->pcdata->quest += victim->pcdata->bounty; sprintf (buf, "%s has taken the %dQp bounty of %s's head", ch->name, victim->pcdata->bounty, victim->name); do_info (ch, buf); victim->pcdata->bounty = 0; send_to_char ("You receive your reward.\n\r", ch); } if ((((ch->race - victim->race) > WizConfig->paradoxlimit && victim->race < 50) && (ch->race > 0)) || ((victim->race < 1) && (ch->race > 0))) // if ( (ch->race - victim->race >= WizConfig->paradoxlimit && victim->race < 50 && ch->race > 0) || (victim->race < 1 && ch->race > 0 ) ) { bool ARTI = FALSE; for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (IS_SET (obj->quest, QUEST_ARTIFACT)) ARTI = TRUE; } if (!nosafe && !ARTI) { ch->paradox[0] += ch->race; ch->paradox[1] += ch->race; ch->paradox[2] += PARADOX_TICK; sprintf (paradoxlog, "%s has %d paradox.", ch->name, ch->paradox[1]); wiznet (ch, WIZ_DEATHS, 7, paradoxlog); } { char *temp = 0; do_fatality (ch, mdecapmsg (temp, ch, victim)); } sprintf (buf, "%s received no status.", ch->name); do_fatality (ch, buf); if (ch->hit == ch->max_hit) do_fatality(ch, "FLAWLESS VICTORY!!"); WizConfig->totaldecaps++; save_wizconfig (); sprintf (log_buf, "%s decapitated by %s at %d for no status.", victim->name, ch->name, ch->in_room->vnum); log_string (log_buf, ch); /* if (!nosafe) { if (number_range(1,3) == 3) { sprintf( buf, "%s is flicked for %d hps!", ch->name, ch->race * (ch->race - victim->race) * 50 + buf2); do_info(ch, buf); ch->max_hit -= ch->race * (ch->race - victim->race) * 50 + buf2; if (ch->max_hit < 1) { ch->max_hit = 500; } } } */ wiznet (ch, WIZ_DEATHS, 7, log_buf); if (IS_CLASS (victim, CLASS_VAMPIRE)) { if (IS_EXTRA (victim, EXTRA_DRAGON)) { REMOVE_BIT(victim->extra,EXTRA_DRAGON); free_string(victim->morph); victim->morph = str_dup(""); } if (IS_POLYAFF (victim, POLY_ZULO)) { REMOVE_BIT(victim->polyaff, POLY_ZULO); free_string(victim->morph); victim->morph = str_dup(""); } if (IS_SET (victim->flag2, VAMP_OBJMASK)) { stc ("You return to your normal form.\n\r", victim); sprintf (buf, "%s transforms back into %s.\n\r", victim->morph, victim->name); act (buf, victim, NULL, NULL, TO_ROOM); free_string (victim->morph); victim->morph = str_dup (""); free_string (victim->objdesc); victim->objdesc = str_dup (""); free_string (victim->long_descr); victim->long_descr = str_dup (""); free_string (victim->short_descr); victim->short_descr = str_dup (victim->name); REMOVE_BIT (victim->flag2, VAMP_OBJMASK); } if (IS_SET (victim->affected_by, AFF_POLYMORPH)) REMOVE_BIT (victim->affected_by, AFF_POLYMORPH); //MattPoint2 } if (IS_CLASS (victim, CLASS_VAMPIRE)) do_mortalvamp (victim, ""); else if (IS_SET (victim->special, SPC_WOLFMAN)) do_unwerewolf (victim, ""); if (IS_CLASS (victim, CLASS_MAGE) && IS_AFFECTED (victim, AFF_POLYMORPH)) do_unpolymorph (victim, ""); ch->fight_timer += 10; behead (victim); do_beastlike (ch, ""); ch->pkill = ch->pkill + 1; victim->pdeath = victim->pdeath + 1; if (IS_SET (victim->newbits, WANTED)) { REMOVE_BIT (victim->newbits, WANTED); } return; } ch->exp = ch->exp + 1000; if (ch->race < 100) ch->race++; if (victim->race > 0) victim->race--; act ("A misty white vapour pours from $N's corpse into your body.", ch, NULL, victim, TO_CHAR); act ("A misty white vapour pours from $N's corpse into $n's body.", ch, NULL, victim, TO_NOTVICT); act ("You double over in agony as raw energy pulses through your veins.", ch, NULL, NULL, TO_CHAR); act ("$n doubles over in agony as sparks of energy crackle around $m.", ch, NULL, NULL, TO_NOTVICT); if (IS_CLASS (victim, CLASS_VAMPIRE)) do_mortalvamp (victim, ""); else if (IS_SET (victim->special, SPC_WOLFMAN)) do_unwerewolf (victim, ""); if (IS_CLASS (victim, CLASS_MAGE) && IS_AFFECTED (victim, AFF_POLYMORPH)) do_unpolymorph (victim, ""); ch->fight_timer += 10; behead (victim); do_beastlike (ch, ""); ch->pkill = ch->pkill + 1; victim->pdeath = victim->pdeath + 1; victim->pcdata->stats[UNI_RAGE] = 0; victim->level = 2; long long recexp= 0; recexp = victim->exp/2; if (!nosafe) { stcprintf (ch, "#w[You receive #r%lld #wexperience points]#n\n\r", recexp); ch->exp += recexp; victim->exp -= recexp; stcprintf (victim, "#w[You lose #r%lld experience points]#n\n\r", recexp); } { char *temp = 0; do_fatality (ch, mdecapmsg (temp, ch, victim)); } if (ch->hit == ch->max_hit) do_fatality(ch, "FLAWLESS VICTORY!!"); if (IS_SET (ch->act, PLR_AUTOSAC)) do_sacrifice (ch, "head"); free_string (ch->pcdata->decapped); ch->pcdata->decapped = str_dup (victim->name); free_string (victim->pcdata->decappedby); victim->pcdata->decappedby = str_dup (ch->name); sprintf (log_buf, "%s decapitated by %s at %d.", victim->name, ch->name, ch->in_room->vnum); log_string (log_buf, ch); wiznet (ch, WIZ_DEATHS, 7, log_buf); WizConfig->totaldecaps++; victim->pcdata->pkill_timer = 30; save_wizconfig (); if (IS_CLASS (victim, CLASS_VAMPIRE)) { if (IS_EXTRA (victim, EXTRA_DRAGON)) { REMOVE_BIT(victim->extra,EXTRA_DRAGON); free_string(victim->morph); victim->morph = str_dup(""); } if (IS_POLYAFF (victim, POLY_ZULO)) { REMOVE_BIT(victim->polyaff, POLY_ZULO); free_string(victim->morph); victim->morph = str_dup(""); } if (IS_SET (victim->affected_by, AFF_POLYMORPH)) REMOVE_BIT (victim->affected_by, AFF_POLYMORPH); } if (ch->pkill + ch->pdeath != 0) { adjust_hiscore ("pkill", ch, ch->pkill); adjust_hiscore ("status", ch, ch->race); } if (victim->pkill + victim->pdeath != 0) { adjust_hiscore ("pkill", victim, victim->pkill); adjust_hiscore ("pdeath", victim, victim->pdeath); adjust_hiscore ("status", ch, ch->race); } return; } void do_crack (CHAR_DATA * ch, char *argument) { OBJ_DATA *obj; OBJ_DATA *right; OBJ_DATA *left; right = get_eq_char (ch, WEAR_WIELD); left = get_eq_char (ch, WEAR_HOLD); if (right != NULL && right->pIndexData->vnum == 12) obj = right; else if (left != NULL && left->pIndexData->vnum == 12) obj = left; else { send_to_char ("You are not holding any heads.\n\r", ch); return; } act ("You hurl $p at the floor.", ch, obj, NULL, TO_CHAR); act ("$n hurls $p at the floor.", ch, obj, NULL, TO_ROOM); act ("$p cracks open, leaking brains out across the floor.", ch, obj, NULL, TO_CHAR); if (obj->chobj != NULL) { act ("$p cracks open, leaking brains out across the floor.", ch, obj, obj->chobj, TO_NOTVICT); act ("$p crack open, leaking brains out across the floor.", ch, obj, obj->chobj, TO_VICT); } else { act ("$p cracks open, leaking brains out across the floor.", ch, obj, NULL, TO_ROOM); } crack_head (ch, obj, obj->name); obj_from_char (obj); extract_obj (obj); } void crack_head (CHAR_DATA * ch, OBJ_DATA * obj, char *argument) { CHAR_DATA *victim; MOB_INDEX_DATA *pMobIndex; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; argument = one_argument (argument, arg1); argument = one_argument (argument, arg2); if (str_cmp (arg2, "mob") && obj->chobj != NULL && !IS_NPC (obj->chobj) && IS_AFFECTED (obj->chobj, AFF_POLYMORPH)) { victim = obj->chobj; make_part (victim, "cracked_head"); make_part (victim, "brain"); sprintf (buf, "the quivering brain of %s", victim->name); free_string (victim->morph); victim->morph = str_dup (buf); return; } else if (!str_cmp (arg2, "mob")) { if ((pMobIndex = get_mob_index (obj->value[1])) == NULL) return; victim = create_mobile (pMobIndex); char_to_room (victim, ch->in_room); make_part (victim, "cracked_head"); make_part (victim, "brain"); extract_char (victim, TRUE, FALSE); return; } else { if ((pMobIndex = get_mob_index (30002)) == NULL) return; victim = create_mobile (pMobIndex); sprintf (buf, capitalize (arg2)); free_string (victim->short_descr); victim->short_descr = str_dup (buf); char_to_room (victim, ch->in_room); make_part (victim, "cracked_head"); make_part (victim, "brain"); extract_char (victim, TRUE, FALSE); return; } return; } void do_garotte (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; int chance; one_argument (argument, arg); chance = number_percent (); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_DROW) || !IS_SET (ch->pcdata->powers[1], DPOWER_GAROTTE)) { send_to_char ("Huh?\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("Garotte whom?\n\r", ch); return; } if (victim == ch) { send_to_char ("That would be a bad idea.\n\r", ch); return; } if (is_safe (ch, victim)) return; if (((obj = get_eq_char (ch, WEAR_WIELD)) == NULL || obj->value[3] != 4) && ((obj = get_eq_char (ch, WEAR_HOLD)) == NULL || obj->value[3] != 4) && ((obj = get_eq_char (ch, WEAR_DUAL)) == NULL || obj->value[3] != 4)) { send_to_char ("You need to wield a whip.\n\r", ch); return; } if (victim->fighting != NULL) { send_to_char ("You can't garotte a fighting person.\n\r", ch); return; } if ((victim->hit < victim->max_hit) && !IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWBODY)) { act ("$N is too hurt for you to sneak up.", ch, NULL, victim, TO_CHAR); return; } check_killer (ch, victim); WAIT_STATE (ch, skill_table[gsn_garotte].beats); if (chance <= 5) { if (!is_inarena (ch) || !IS_SET (victim->war, WARRING)) ch->fight_timer += 5; damage (ch, victim, 0, gsn_garotte); return; } if (chance == 13 || chance == 31) { /* bad luck :) */ act ("$n wraps a whip around $N's neck! $N is choking to death!", ch, NULL, victim, TO_NOTVICT); act ("You wrap your whip around $N's neck and refuse to let go!", ch, NULL, victim, TO_CHAR); act ("$n wraps his whip around your neck, and you can't break free!", ch, NULL, victim, TO_VICT); if (!IS_NPC (victim)) { if (!is_inarena (ch) && !IS_SET (ch->war, WARRING)) ch->fight_timer += 5; if (!is_inarena (victim) && !IS_SET (victim->war, WARRING)) { if (victim->in_room->vnum != ROOM_VNUM_ALTAR) { victim->hit = 1; victim->fight_timer = 0; update_pos (victim); char_from_room (victim); char_to_room (victim, get_room_index (ROOM_VNUM_ALTAR)); sprintf (buf, "%s has been assassinated by %s!", victim->name, ch->name); do_info (ch, buf); } } } else { victim->hit = 1; damage (ch, victim, 1000, gsn_garotte); } return; } else { multi_hit (ch, victim, gsn_garotte); return; } return; } void do_dark_garotte (CHAR_DATA * ch, char *argument) { char buf[MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; int chance,chancez; int i; one_argument (argument, arg); chance = number_percent (); if (IS_NPC (ch)) return; if (!IS_CLASS (ch, CLASS_DROW) || !IS_SET (ch->pcdata->powers[1], DPOWER_GAROTTE) || !IS_SET (ch->pcdata->powers[1], DPOWER_DGAROTTE)) { send_to_char ("Huh?\n\r", ch); return; } /* if (weather_info.sunlight == SUN_LIGHT || weather_info.sunlight == SUN_RISE) { send_to_char("It must be night for you to use this power.\n\r", ch); return; } */ if (!IS_SET (ch->newbits, NEW_DARKNESS)) { send_to_char ("You have to be surrounded in darkness.\n\r", ch); return; } if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("Dark Garotte whom?\n\r", ch); return; } if (victim == ch) { send_to_char ("That would be a bad idea.\n\r", ch); return; } if (!IS_NPC (victim)) { if ((IS_SET (ch->war, WARRING) || (IS_SET (victim->war, WARRING)))) { stc ("You can't do this in a war.\n\r", ch); return; } if (is_inarena (ch) || is_inarena (victim)) { stc ("You can't do this in a war.\n\r", ch); return; } } if (is_safe (ch, victim)) return; if (((obj = get_eq_char (ch, WEAR_WIELD)) == NULL || obj->value[3] != 4) && ((obj = get_eq_char (ch, WEAR_HOLD)) == NULL || obj->value[3] != 4) && ((obj = get_eq_char (ch, WEAR_DUAL)) == NULL || obj->value[3] != 4)) { send_to_char ("You need to wield a whip.\n\r", ch); return; } if (victim->fighting != NULL) { send_to_char ("You can't garotte a fighting person.\n\r", ch); return; } if ((victim->hit < victim->max_hit) && !IS_SET (ch->pcdata->powers[1], DPOWER_SHADOWBODY)) { act ("$N is too hurt for you to sneak up.", ch, NULL, victim, TO_CHAR); return; } check_killer (ch, victim); WAIT_STATE (ch, skill_table[gsn_garotte].beats); REMOVE_BIT (ch->newbits, NEW_DARKNESS); REMOVE_BIT (ch->in_room->room_flags, ROOM_TOTAL_DARKNESS); if (IS_SET (victim->special, SPC_DROW_ASN)) chancez = 80; else chancez = 95; if (chance > chancez) { /* bad luck :) */ act ("$n wraps a whip around $N's neck! $N is choking to death!", ch, NULL, victim, TO_NOTVICT); act ("You wrap your whip around $N's neck and refuse to let go!", ch, NULL, victim, TO_CHAR); act ("$n wraps his whip around your neck, and you can't break free!", ch, NULL, victim, TO_VICT); if (!IS_NPC (victim)) { ch->fight_timer += 5; if (!is_inarena (victim) && !IS_SET (victim->war, WARRING)) { if (victim->in_room->vnum != ROOM_VNUM_ALTAR) { victim->hit = 1; victim->fight_timer = 0; victim->pdeath += 1; ch->pkill += 1; update_pos (victim); char_from_room (victim); char_to_room (victim, get_room_index (ROOM_VNUM_ALTAR)); sprintf (buf, "%s has been assassinated by %s!", victim->name, ch->name); do_info (ch, buf); } } } else { victim->hit = 1; damage (ch, victim, 1000, gsn_garotte); } return; } else if (chance <= 5) { ch->fight_timer += 5; damage (ch, victim, 0, gsn_garotte); return; } else { for (i = 1; i < 3; i++) multi_hit (ch, victim, gsn_garotte); return; } return; } bool has_timer (CHAR_DATA * ch) { if (ch->fight_timer > 0 && !IS_NPC (ch) && !IS_IMMORTAL (ch)) { stcprintf (ch, "You still have '#r%d#n' ticks left on your fight timer before you can do that\n\r", ch->fight_timer); return TRUE; } return FALSE; } /* Voodoo skill by KaVir */ void do_voodoo (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *obj; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; char part1[MAX_INPUT_LENGTH]; char part2[MAX_INPUT_LENGTH]; argument = one_argument (argument, arg1); argument = one_argument (argument, arg2); if (arg1[0] == '\0') { send_to_char ("Who do you wish to use voodoo magic on?\n\r", ch); return; } if ((obj = get_eq_char (ch, WEAR_HOLD)) == NULL) { send_to_char ("You are not holding a voodoo doll.\n\r", ch); return; } if ((victim = get_char_world (ch, arg1)) == NULL) { send_to_char ("They are not here.\n\r", ch); return; } if (IS_NPC (victim)) { send_to_char ("Not on NPC's.\n\r", ch); return; } sprintf (part2, obj->name); sprintf (part1, "%s voodoo doll", victim->name); if (str_cmp (part1, part2)) { sprintf (buf, "But you are holding %s, not %s!\n\r", obj->short_descr, victim->name); send_to_char (buf, ch); return; } if (arg2[0] == '\0') { send_to_char ("You can 'stab', 'burn' or 'throw' the doll.\n\r", ch); } else if (!str_cmp (arg2, "stab")) { WAIT_STATE (ch, 12); act ("You stab a pin through $p.", ch, obj, NULL, TO_CHAR); act ("$n stabs a pin through $p.", ch, obj, NULL, TO_ROOM); if (!IS_NPC (victim) && IS_IMMUNE (victim, IMM_VOODOO)) return; act ("You feel an agonising pain in your chest!", victim, NULL, NULL, TO_CHAR); act ("$n clutches $s chest in agony!", victim, NULL, NULL, TO_ROOM); } else if (!str_cmp (arg2, "burn")) { WAIT_STATE (ch, 12); act ("You set fire to $p.", ch, obj, NULL, TO_CHAR); act ("$n sets fire to $p.", ch, obj, NULL, TO_ROOM); act ("$p burns to ashes.", ch, obj, NULL, TO_CHAR); act ("$p burns to ashes.", ch, obj, NULL, TO_ROOM); obj_from_char (obj); extract_obj (obj); if (!IS_NPC (victim) && IS_IMMUNE (victim, IMM_VOODOO)) return; if (IS_AFFECTED (victim, AFF_FLAMING)) return; if (WORN_ARTIFACT (victim, ARTI_DEMONS_HEART)) return; SET_BIT (victim->affected_by, AFF_FLAMING); act ("You suddenly burst into flames!", victim, NULL, NULL, TO_CHAR); act ("$n suddenly bursts into flames!", victim, NULL, NULL, TO_ROOM); } else if (!str_cmp (arg2, "throw")) { WAIT_STATE (ch, 12); act ("You throw $p to the ground.", ch, obj, NULL, TO_CHAR); act ("$n throws $p to the ground.", ch, obj, NULL, TO_ROOM); obj_from_char (obj); obj_to_room (obj, ch->in_room); if (!IS_NPC (victim) && IS_IMMUNE (victim, IMM_VOODOO)) return; if (victim->position < POS_STANDING) return; if (victim->position == POS_FIGHTING) stop_fighting (victim, TRUE); act ("A strange force picks you up and hurls you to the ground!", victim, NULL, NULL, TO_CHAR); act ("$n is hurled to the ground by a strange force.", victim, NULL, NULL, TO_ROOM); victim->position = POS_RESTING; victim->hit = victim->hit - number_range (ch->level, (5 * ch->level)); update_pos (victim); if (victim->position == POS_DEAD && !IS_NPC (victim)) { victim->form = 7; do_killperson (ch, victim->name); return; } } else { send_to_char ("You can 'stab', 'burn' or 'throw' the doll.\n\r", ch); } return; } void do_autostance (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; argument = one_argument (argument, arg); if (IS_NPC (ch)) return; if (arg[0] == '\0') { stc ("Syntax: autostance <stance>\n\r", ch); stc ("Stance being one of:\n\r", ch); stc (" none crab mongoose viper bull crane\n\r", ch); stc ("And if you have them:\n\r", ch); stc (" mantis tiger dragon swallow monkey\n\r", ch); return; } if (!str_cmp (arg, "none")) { send_to_char ("You no longer autostance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_NONE; } else if (!str_cmp (arg, "crane")) { send_to_char ("You now autostance into the crane stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_CRANE; } else if (!str_cmp (arg, "crab")) { send_to_char ("You now autostance into the crab stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_CRAB; } else if (!str_cmp (arg, "bull")) { send_to_char ("You now autostance into the bull stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_BULL; } else if (!str_cmp (arg, "viper")) { send_to_char ("You now autostance into the viper stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_VIPER; } else if (!str_cmp (arg, "mongoose")) { send_to_char ("You now autostance into the mongoose stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_MONGOOSE; } else if (!str_cmp (arg, "mantis") && ch->stance[STANCE_CRANE] >= 200 && ch->stance[STANCE_VIPER] >= 200) { send_to_char ("You now autostance into the mantis stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_MANTIS; } else if (!str_cmp (arg, "monkey") && ch->stance[STANCE_CRANE] >= 200 && ch->stance[STANCE_MONGOOSE] >= 200) { send_to_char ("You now autostance into the monkey stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_MONKEY; } else if (!str_cmp (arg, "swallow") && ch->stance[STANCE_CRAB] >= 200 && ch->stance[STANCE_MONGOOSE] >= 200) { send_to_char ("You now autostance into the swallow stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_SWALLOW; } else if (!str_cmp (arg, "tiger") && ch->stance[STANCE_BULL] >= 200 && ch->stance[STANCE_VIPER] >= 200) { send_to_char ("You now autostance into the tiger stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_TIGER; } else if (!str_cmp (arg, "dragon") && ch->stance[STANCE_CRAB] >= 200 && ch->stance[STANCE_BULL] >= 200) { send_to_char ("You now autostance into the dragon stance.\n\r", ch); ch->stance[MONK_AUTODROP] = STANCE_DRAGON; } else do_autostance (ch, ""); } void autodrop (CHAR_DATA * ch) { int st; char buf[MAX_INPUT_LENGTH]; char buf2[MAX_INPUT_LENGTH]; char stancename[10]; if (IS_NPC (ch)) return; st = ch->stance[11]; if (st == STANCE_VIPER) sprintf (stancename, "viper"); else if (st == STANCE_CRANE) sprintf (stancename, "crane"); else if (st == STANCE_CRAB) sprintf (stancename, "crab"); else if (st == STANCE_MONGOOSE) sprintf (stancename, "mongoose"); else if (st == STANCE_BULL) sprintf (stancename, "bull"); else if (st == STANCE_MANTIS) sprintf (stancename, "mantis"); else if (st == STANCE_DRAGON) sprintf (stancename, "dragon"); else if (st == STANCE_TIGER) sprintf (stancename, "tiger"); else if (st == STANCE_MONKEY) sprintf (stancename, "monkey"); else if (st == STANCE_SWALLOW) sprintf (stancename, "swallow"); else return; if (ch->stance[0] < 1) { ch->stance[0] = st; sprintf (buf, "You autodrop into the %s stance.", stancename); act (buf, ch, NULL, NULL, TO_CHAR); sprintf (buf2, "$n autodrops into the %s stance.", stancename); act (buf2, ch, NULL, NULL, TO_ROOM); } } void death_message (CHAR_DATA * ch, CHAR_DATA * victim) { char buf[MAX_STRING_LENGTH]; char *chname; char *chsex; if (ch == NULL || victim == NULL || victim->form < 1) return; if (ch->in_room == NULL || victim->in_room == NULL) return; chname = !IS_NPC (ch) ? ch->name : ch->short_descr; chsex = ch->sex == SEX_FEMALE ? "her" : "his"; switch (victim->form) { default: sprintf (buf, "%s has just died!", chname); break; case 1: sprintf (buf, "%s has just been dissolved by %s's acid blood!", victim->name, chname); break; case 2: sprintf (buf, "%s just committed suicide by tearing %s own heart out!", chname, chsex); break; case 3: sprintf (buf, "%s has just sucked out all of %s's blood!", chname, victim->name); break; case 4: sprintf (buf, "%s has just boiled all of %s's blood!", chname, victim->name); break; case 5: sprintf (buf, "%s has just turned %s's blood into water!", chname, victim->name); break; case 6: sprintf (buf, "%s has just evaporated all of %s's blood!", chname, victim->name); break; case 7: sprintf (buf, "%s has just smashed %s to death!", chname, victim->name); break; case 8: sprintf (buf, "%s has just blown apart %s's mind!", chname, victim->name); break; case 9: sprintf (buf, "%s has just torn out %s's soul!", chname, victim->name); break; case 10: sprintf (buf, "%s has just sucked out %s's life essence!", chname, victim->name); break; case 11: sprintf (buf, "%s has just blown apart %s's eardrums!", chname, victim->name); break; case 12: sprintf (buf, "%s's entrails just poured from %s torn open stomach!", chname, chsex); break; case 13: sprintf (buf, "%s just died from %s wounds!", chname, chsex); break; case 14: sprintf (buf, "%s just burned to death!", chname); break; case 16: sprintf (buf, "%s just died a long, slow, painful death!", chname); break; case 17: sprintf (buf, "%s has just torn apart %s's body!", chname, victim->name); break; case 18: sprintf (buf, "%s has slain %s in cold blood!", chname, victim->name); break; case 19: sprintf (buf, "%s has just shot down %s!", chname, victim->name); break; case 20: sprintf (buf, "%s has struck %s a mortal wound!", chname, victim->name); break; case 21: sprintf (buf, "%s has torn off %s's face!", chname, victim->name); break; case 22: sprintf (buf, "%s has ripped out %s's windpipe!", chname, victim->name); break; case 23: sprintf (buf, "%s has ripped out %s's entrails!", chname, victim->name); break; case 24: sprintf (buf, "%s has broken %s's back!", chname, victim->name); break; case 25: sprintf (buf, "%s has broken %s's neck!", chname, victim->name); break; case 26: sprintf (buf, "%s has disembowelled %s!", chname, victim->name); break; case 27: sprintf (buf, "%s has thrust %s weapon through %s's head!", chname, chsex, victim->name); break; case 28: sprintf (buf, "%s has sliced open %s's carotid artery!", chname, victim->name); break; case 29: sprintf (buf, "%s has sliced open %s's throat!", chname, victim->name); break; case 30: sprintf (buf, "%s has split open %s's head!", chname, victim->name); break; case 31: sprintf (buf, "%s has thrust %s weapon through %s's chest!", chname, chsex, victim->name); break; case 32: sprintf (buf, "%s has swung %s weapon between %s's legs!", chname, chsex, victim->name); break; case 33: sprintf (buf, "%s has sliced off %s's arm!", chname, victim->name); break; case 34: sprintf (buf, "%s has sliced off %s's leg!", chname, victim->name); break; case 35: sprintf (buf, "%s has thrust %s weapon through %s's mouth!", chname, chsex, victim->name); break; case 36: sprintf (buf, "%s has thrust %s weapon through %s's eye!", chname, chsex, victim->name); break; case 37: sprintf (buf, "%s has smashed in %s's chest!", chname, victim->name); break; case 38: sprintf (buf, "%s has shattered %s's spine!", chname, victim->name); break; case 39: sprintf (buf, "%s has torn out %s's throat with %s teeth!", chname, victim->name, chsex); break; case 40: sprintf (buf, "%s has torn out %s's throat with %s claws!", chname, victim->name, chsex); break; case 41: sprintf (buf, "%s has clawed out %s's eyeball!", chname, victim->name); break; case 42: sprintf (buf, "%s has torn open %s's chest with %s claws!", chname, victim->name, chsex); break; case 43: sprintf (buf, "%s has sucked out %s's brains!", chname, victim->name); break; case 44: sprintf (buf, "%s has just eaten %s whole!", chname, victim->name); break; } buf[0] = UPPER (buf[0]); do_fatality (ch, buf); if (ch->hit == ch->max_hit) do_fatality(ch, "FLAWLESS VICTORY!!"); if (IS_EXTRA (victim, EXTRA_PREGNANT)) { sprintf (buf, "%s's unborn child has been slain!", victim->name); buf[0] = UPPER (buf[0]); do_fatality (ch, buf); } return; } void death_message_obj (CHAR_DATA * ch, OBJ_DATA * obj) { char buf[MAX_STRING_LENGTH]; char *chname; char *chsex; if (ch == NULL || obj == NULL || ch->form < 1) return; if (ch->in_room == NULL) return; chname = !IS_NPC (ch) ? ch->name : ch->short_descr; chsex = ch->sex == SEX_FEMALE ? "her" : "his"; switch (ch->form) { default: sprintf (buf, "%s has just died!", chname); break; case 1: sprintf (buf, "%s has just been dissolved by %s's acid blood!", chname, obj->short_descr); break; case 2: sprintf (buf, "%s just committed suicide by tearing %s own heart out!", chname, chsex); break; case 3: sprintf (buf, "%s has just sucked out all of %s's blood!", capitalize(obj->short_descr), chname); break; case 4: sprintf (buf, "%s has just boiled all of %s's blood!", capitalize(obj->short_descr), chname); break; case 5: sprintf (buf, "%s has just turned %s's blood into water!", capitalize(obj->short_descr), chname); break; case 6: sprintf (buf, "%s has just evaporated all of %s's blood!", capitalize(obj->short_descr), chname); break; case 7: sprintf (buf, "%s has just smashed %s to death!", capitalize(obj->short_descr), chname); break; case 8: sprintf (buf, "%s has just blown apart %s's mind!", capitalize(obj->short_descr), chname); break; case 9: sprintf (buf, "%s has just torn out %s's soul!", capitalize(obj->short_descr), chname); break; case 10: sprintf (buf, "%s has just sucked out %s's life essence!", capitalize(obj->short_descr), chname); break; case 11: sprintf (buf, "%s has just blown apart %s's eardrums!", capitalize(obj->short_descr), chname); break; case 12: sprintf (buf, "%s's entrails just poured from %s torn open stomach!", chname, chsex); break; case 13: sprintf (buf, "%s just died from %s wounds!", chname, chsex); break; case 14: sprintf (buf, "%s just burned to death!", chname); break; case 16: sprintf (buf, "%s just died a long, slow, painful death!", chname); break; case 17: sprintf (buf, "%s has just torn apart %s's body!", capitalize(obj->short_descr), chname); break; case 18: sprintf (buf, "%s has slain %s in cold blood!", capitalize(obj->short_descr), chname); break; case 19: sprintf (buf, "%s has just shot down %s!", capitalize(obj->short_descr), chname); break; case 20: sprintf (buf, "%s has struck %s a mortal wound!", capitalize(obj->short_descr), chname); break; case 21: sprintf (buf, "%s has torn off %s's face!", capitalize(obj->short_descr), chname); break; case 22: sprintf (buf, "%s has ripped out %s's windpipe!", capitalize(obj->short_descr), chname); break; case 23: sprintf (buf, "%s has ripped out %s's entrails!", capitalize(obj->short_descr), chname); break; case 24: sprintf (buf, "%s has broken %s's back!", capitalize(obj->short_descr), chname); break; case 25: sprintf (buf, "%s has broken %s's neck!", capitalize(obj->short_descr), chname); break; case 26: sprintf (buf, "%s has disembowelled %s!", capitalize(obj->short_descr), chname); break; case 27: sprintf (buf, "%s has thrust itself through %s's head!", capitalize(obj->short_descr), chname); break; case 28: sprintf (buf, "%s has sliced open %s's carotid artery!", capitalize(obj->short_descr), chname); break; case 29: sprintf (buf, "%s has sliced open %s's throat!", capitalize(obj->short_descr), chname); break; case 30: sprintf (buf, "%s has split open %s's head!", capitalize(obj->short_descr), chname); break; case 31: sprintf (buf, "%s has thrust itself through %s's chest!", capitalize(obj->short_descr), chname); break; case 32: sprintf (buf, "%s has swung itself between %s's legs!", capitalize(obj->short_descr), chname); break; case 33: sprintf (buf, "%s has sliced off %s's arm!", capitalize(obj->short_descr), chname); break; case 34: sprintf (buf, "%s has sliced off %s's leg!", capitalize(obj->short_descr), chname); break; case 35: sprintf (buf, "%s has thrust itself through %s's mouth!", capitalize(obj->short_descr), chname); break; case 36: sprintf (buf, "%s has thrust itself through %s's eye!", capitalize(obj->short_descr), chname); break; case 37: sprintf (buf, "%s has smashed in %s's chest!", capitalize(obj->short_descr), chname); break; case 38: sprintf (buf, "%s has shattered %s's spine!", capitalize(obj->short_descr), chname); break; case 39: sprintf (buf, "%s has torn out %s's throat with its teeth!", capitalize(obj->short_descr), chname); break; case 40: sprintf (buf, "%s has torn out %s's throat with its claws!", capitalize(obj->short_descr), chname); break; case 41: sprintf (buf, "%s has clawed out %s's eyeball!", capitalize(obj->short_descr), chname); break; case 42: sprintf (buf, "%s has torn open %s's chest with its claws!", capitalize(obj->short_descr), chname); break; case 43: sprintf (buf, "%s has sucked out %s's brains!", capitalize(obj->short_descr), chname); break; case 44: sprintf (buf, "%s has just eaten %s whole!", capitalize(obj->short_descr), chname); break; } buf[0] = UPPER (buf[0]); do_fatality (ch, buf); if (IS_EXTRA (ch, EXTRA_PREGNANT)) { sprintf (buf, "%s's unborn child has been slain!", chname); buf[0] = UPPER (buf[0]); do_fatality (ch, buf); } return; } void demon_gain (CHAR_DATA * ch, CHAR_DATA * victim) { int vnum; if (IS_NPC (victim) && !IS_NPC (ch)) { if (IS_CLASS (ch, CLASS_DEMON) || IS_CLASS (ch, CLASS_DROW) || IS_CLASS (ch, CLASS_DRAGON) ) { if ((vnum = victim->pIndexData->vnum) > 29000) { switch (vnum) { default: if (IS_CLASS (ch, CLASS_DEMON)) { ch->pcdata->stats[DEMON_CURRENT] += victim->level; ch->pcdata->stats[DEMON_TOTAL] += victim->level; } else if (IS_CLASS (ch, CLASS_DRAGON)) ch->pcdata->stats[DEMON_CURRENT] += victim->level * 3; else ch->pcdata->stats[DROW_POWER] += victim->level * 4 / 3; break; /* List of mob vnums which don't give dp's */ case 29600: case 30000: case 30001: case 30006: case 30007: case 30008: case 30009: case 30010: case 30013: case 30014: case 30015: case 30016: break; } } else if ((IS_NPC (victim)) && (!IS_SET (victim->act, ACT_NOEXP)) && (!IS_SET (ch->more, PLR_COMB_EXP))) { if (IS_CLASS (ch, CLASS_DEMON)) { ch->pcdata->stats[DEMON_CURRENT] += victim->level; ch->pcdata->stats[DEMON_TOTAL] += victim->level; } else if (IS_CLASS (ch, CLASS_DRAGON)) ch->pcdata->stats[DEMON_CURRENT] += victim->level * 3; else ch->pcdata->stats[DROW_POWER] += victim->level * 4 / 3; } } if (ch->level == 1 && ch->mkill >= 4) { ch->level = 2; do_save (ch, ""); } } return; } bool is_safe_silent (CHAR_DATA * ch, CHAR_DATA * victim) { OBJ_DATA *obj; OBJ_DATA *obj_next; /* if (victim->fighting == ch) return FALSE; if (ch->fighting == victim) return FALSE; */ if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && !IS_AFFECTED (victim, AFF_SHADOWPLANE)) { return TRUE; } if (!IS_AFFECTED (ch, AFF_SHADOWPLANE) && IS_AFFECTED (victim, AFF_SHADOWPLANE)) { return TRUE; } if (IS_NPC (victim) && IS_SET (ch->act, ACT_NO_KILL)) { return TRUE; } if (IS_NPC (victim) && (victim->pIndexData->vnum == 3145)) { return TRUE; } if (IS_SET (victim->more, MORE_JAIL)) { return TRUE; } if (IS_SET (ch->tag_flags, TAG_PLAYING) || IS_SET (victim->tag_flags, TAG_PLAYING)) { return TRUE; } if (IS_SET (victim->war, WARRING) && !IS_SET (ch->war, WARRING)) { return TRUE; } if ((IS_SET (ch->flag2, AFF2_INARENA) && !IS_SET (victim->flag2, AFF2_INARENA)) || (IS_SET (victim->flag2, AFF2_INARENA) && !IS_SET (ch->flag2, AFF2_INARENA))) { return TRUE; } /* Will look into this later if (!IS_NPC(victim) && ch->registerred != 1 && ch->email_set != 2) return TRUE; if (!IS_NPC(ch) && victim->registerred != 1 && victim->email_set != 2) return TRUE; */ if (!IS_NPC (victim) && IS_SET (ch->extra2, NHELPER) && (victim != ch)) { if (IS_SET (ch->flag2, AFF2_INARENA) && (IS_SET (victim->flag2, AFF2_INARENA))) { // do nothing } else if (IS_SET (victim->war, WARRING) && IS_SET (ch->war, WARRING)) { // do nothing } else { return TRUE; } } if (!IS_NPC (ch) && IS_SET (victim->extra2, NHELPER) && (victim != ch)) { if (IS_SET (ch->flag2, AFF2_INARENA) && (IS_SET (victim->flag2, AFF2_INARENA))) { // do nothing } else if (IS_SET (victim->war, WARRING) && IS_SET (ch->war, WARRING)) { // do nothing } else { return TRUE; } } if (!IS_NPC (ch) && ch->level < 3 && !IS_NPC (victim) && (ch != victim)) { return TRUE; } /* Make it so newbies cant be killed by players. */ if (!IS_NPC (victim) && (get_hours (ch) < 10) && !IS_NPC (ch) && (ch != victim) && !IS_SET (ch->extra2, PKREADY)) { return TRUE; } if (!IS_NPC (ch) && (get_hours (victim) < 10) && !IS_NPC (victim) && (ch != victim) && !IS_SET (victim->extra2, PKREADY)) { return TRUE; } if (!IS_NPC (victim) && !IS_NPC (ch) && (victim->level < 3) && (ch != victim)) { return TRUE; } if (!IS_NPC (victim) && nosafe) { return FALSE; } if (!IS_NPC (victim) && IS_SET (victim->newbits, NEW_NOTEWRITE)) { return TRUE; } // People with artifacts aren't safe. - Krynn for (obj = victim->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if (IS_SET (obj->quest, QUEST_ARTIFACT)) return FALSE; } /* Ethereal people can only attack other ethereal people */ if (IS_AFFECTED (ch, AFF_ETHEREAL) && !IS_AFFECTED (victim, AFF_ETHEREAL)) { return TRUE; } if (!IS_AFFECTED (ch, AFF_ETHEREAL) && IS_AFFECTED (victim, AFF_ETHEREAL)) { return TRUE; } /* You cannot attack across planes */ if (IS_AFFECTED (ch, AFF_SHADOWPLANE) && !IS_AFFECTED (victim, AFF_SHADOWPLANE)) { return TRUE; } if (!IS_AFFECTED (ch, AFF_SHADOWPLANE) && IS_AFFECTED (victim, AFF_SHADOWPLANE)) { return TRUE; } /* if ( IS_SET(ch->in_room->room_flags,ROOM_SAFE) ) { return TRUE; } */ /* Deal with safe rooms (either you or they are in one) */ if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_STEELSHIELD)) { return TRUE; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_STEELSHIELD)) { return TRUE; } if (!ch || !victim) return TRUE; if (!ch->in_room || !victim->in_room) return TRUE; if (ch->in_room == NULL || victim->in_room == NULL || IS_SET (ch->in_room->room_flags, ROOM_SAFE) || IS_SET (victim->in_room->room_flags, ROOM_SAFE)) { if (IS_NPC (victim)) { return TRUE; } else if ( /*!IS_NPC(victim) && */ victim->fight_timer <= 0 && !IS_ITEMAFF (victim, ITEMA_ARTIFACT)) { return TRUE; } } if (!IS_NPC (victim)) { CHAR_DATA *rch; for (rch = ch->in_room->people; rch; rch = rch->next_in_room) { if (IS_CLASS (rch, CLASS_FAE) && !IS_NPC (rch) && IS_SET (rch->extra2, EXTRA2_NEUTRAL)) { return TRUE; } } } if (IS_HEAD (ch, LOST_HEAD) || IS_EXTRA (ch, EXTRA_OSWITCH)) { return TRUE; } else if (IS_HEAD (victim, LOST_HEAD) || IS_EXTRA (victim, EXTRA_OSWITCH)) { return TRUE; } if (IS_NPC (ch) || IS_NPC (victim)) return FALSE; /* Thx Josh! */ if (victim->fighting == ch) return FALSE; if (ch->fighting == victim) return FALSE; if (IS_ITEMAFF (ch, ITEMA_PEACE)) { return TRUE; } if (IS_ITEMAFF (victim, ITEMA_PEACE)) { return TRUE; } if (!IS_NPC (ch) && IS_EXTRA (ch, EXTRA_EARTHMELD)) return TRUE; if (!IS_NPC (victim) && IS_EXTRA (victim, EXTRA_EARTHMELD)) return TRUE; if (!IS_NPC (ch) && IS_AFFECTED (ch, AFF_SAFE)) { return TRUE; } if (!IS_NPC (victim) && IS_AFFECTED (victim, AFF_SAFE)) { return TRUE; } if (ch->trust > LEVEL_BUILDER) { return TRUE; } if (victim->trust > LEVEL_BUILDER) { return TRUE; } if (!CAN_PK (ch) || !CAN_PK (victim)) { return TRUE; } if (ch != victim && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF(ch, VAM_MORTAL)) && IS_SET (ch->special, SPC_INCONNU) && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF (victim, VAM_MORTAL))) return TRUE; else if (ch != victim && (IS_CLASS (victim, CLASS_VAMPIRE) || IS_VAMPAFF(victim, VAM_MORTAL)) && IS_SET (victim->special, SPC_INCONNU) && (IS_CLASS (ch, CLASS_VAMPIRE) || IS_VAMPAFF (ch, VAM_MORTAL))) return TRUE; return FALSE; } /* * returns the amount of damage done in a single mock hit. * used in consider! -- Serenity */ int mock_one_hit (CHAR_DATA * ch, CHAR_DATA * victim, int dt, int handtype) { int return_result = 0; OBJ_DATA *wield; OBJ_DATA *gloves; int victim_ac; int thac0; int thac0_00; int thac0_32; int dam; int diceroll; int level; bool right_hand; int max_dam = victim->damcap[DAM_CAP]; if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return 0; if (handtype == 8) { wield = get_eq_char (ch, WEAR_FOURTH); right_hand = FALSE; } else if (handtype == 4) { wield = get_eq_char (ch, WEAR_THIRD); right_hand = FALSE; } else if (handtype == 2) { wield = get_eq_char (ch, WEAR_HOLD); right_hand = FALSE; } else { if (!IS_NPC (ch) && (wield = get_eq_char (ch, WEAR_DUAL)) != NULL); else if (!IS_NPC (ch) && IS_SET (ch->extra2, PLR_RIGHTHAND)) wield = get_eq_char (ch, WEAR_WIELD); else if (!IS_NPC (ch) && IS_SET (ch->act, PLR_LEFTHAND)) wield = get_eq_char (ch, WEAR_HOLD); else { if (number_range (1, 10) > 4 && !IS_NPC (ch)) wield = get_eq_char (ch, WEAR_HOLD); else wield = get_eq_char (ch, WEAR_WIELD); } right_hand = 1; // improve the right hand anyway... } if (dt == TYPE_UNDEFINED) { dt = TYPE_HIT; if (wield != NULL && wield->item_type == ITEM_WEAPON) dt += wield->value[3]; } if (ch->wpn[dt - 1000] > 5) level = (ch->wpn[dt - 1000] / 5); else level = 1; if (level > 40) level = 40; /* * Calculate to-hit-armor-class-0 versus armor. */ if (IS_NPC (ch)) { thac0_00 = 20; thac0_32 = 0; } else { thac0_00 = SKILL_THAC0_00; thac0_32 = SKILL_THAC0_32; } thac0 = 0 - interpolate (level, thac0_00, thac0_32) - (char_hitroll (ch) / 30); victim_ac = UMIN (10, char_ac (victim) / 100); if (!can_see (ch, victim)) victim_ac -= 100; if (IS_CLASS (ch, CLASS_DRAGON) && IS_SET (ch->pcdata->dragonaff, DRA_TERROR) && IS_NPC (victim)) { victim_ac += 200; } while ((diceroll = number_bits (5)) >= 20) ; if (diceroll == 0 || (diceroll != 19 && diceroll < thac0 - victim_ac)) { /* Miss. */ return_result += 0; tail_chain (); return 0; } /* * Hit. * Calc damage. */ if (IS_NPC (ch)) { dam = number_range (ch->level, ch->level * 3 / 2); if (wield != NULL) dam += dam * 0.5; } else { if (IS_VAMPAFF (ch, VAM_CLAWS) && wield == NULL) dam = number_range (10, 20); else if (IS_CLASS (ch, CLASS_DRAGON)) dam = number_range (500, 750); else if (IS_CLASS (ch, CLASS_WEREWOLF)) dam = dice (10, 35); else if (IS_SET (ch->newbits, NEW_MONKADAM)) dam = dice (10, 25); else if (wield != NULL && wield->item_type == ITEM_WEAPON) dam = number_range (wield->value[1], wield->value[2]); else dam = number_range (1, 4); } /* Fun with weapons */ dam += char_damroll (ch); dam = add_bonuses (ch, victim, dam, dt); /* Werewolf Silver Stuff.. */ if (!IS_NPC (victim) && IS_CLASS (victim, CLASS_WEREWOLF)) { if (number_percent () > victim->pcdata->powers[WPOWER_SILVER]) { if (is_garou (ch)) { if (IS_GAR1 (ch, GAROU_AVENGER)) dam *= 3; else if (ch->gifts[AHROUN] >= 4 || ch->gifts[SILVERFANGS] >= 2) dam *= 2.2; else if (wield != NULL && IS_SET (wield->spectype, SITEM_SILVER)) dam *= 2; else if ((gloves = get_eq_char (ch, WEAR_HANDS)) != NULL && IS_SET (gloves->spectype, SITEM_SILVER)) dam *= 2; } else if (!is_garou (ch)) { if (wield != NULL && IS_SET (wield->spectype, SITEM_SILVER)) dam *= 2; else if ((gloves = get_eq_char (ch, WEAR_HANDS)) != NULL && IS_SET (gloves->spectype, SITEM_SILVER)) dam *= 2; } } } if (dt == gsn_backstab) { if (IS_CLASS (ch, CLASS_DROW)) dam *= number_range (4, 5); else dam *= number_range (2, 3); if (IS_CLASS (ch, CLASS_NINJA) && !IS_NPC (ch) && ch->pcdata->powers[NPOWER_NINGENNO] >= 2) dam *= number_range (4, 8); else dam *= number_range (2, 4); } if (dt == gsn_garotte) dam *= (number_range (3, 5)); if (dt == gsn_circle) dam *= number_range (2, 4); if (IS_CREATOR (ch)) max_dam = 10000000; if (get_hours (ch) < 6 && !IS_NPC (ch) && !IS_SET (ch->extra2, PKREADY)) dam *= 2; if (get_hours (victim) < 6 && !IS_NPC (victim) && !IS_SET (victim->extra2, PKREADY)) dam /= 2; if (victim == NULL || victim->position == POS_DEAD) return 0; if (!IS_NPC (ch) && IS_CLASS (ch, CLASS_FAE) && IS_EXTRA2 (ch, EXTRA2_FAEMIGHT)) dam *= 1.7; /* * Stop up any residual loopholes. */ if (victim->damcap[DAM_CHANGE] == 1) { update_damcap (victim, ch); max_dam = victim->damcap[DAM_CAP]; // after we update the damcap, let's assign it eh? -- serenity } if (dam > max_dam) dam = max_dam; if (victim != ch) { if (is_safe_silent (ch, victim)) return 0; if (IS_AFFECTED (ch, AFF_HIDE)) { if (!can_see (victim, ch)) { dam *= 1.5; } } if (IS_CLASS (ch, CLASS_NINJA) && IS_SET (ch->act, PLR_WIZINVIS)) { if (!can_see (victim, ch)) { dam *= 3; } } else if (IS_CLASS (ch, CLASS_MONK) && IS_SET (ch->act, PLR_WIZINVIS)) { if (!can_see (victim, ch)) { dam *= 1.2; } } if ( (IS_AFFECTED (victim, AFF_SANCTUARY) && dam > 1 ) || ( WORN_ARTIFACT( victim, ARTI_CLOAK_OF_THE_ARCHMAGI ) && dam > 1 ) ) dam *= 0.5; if (victim->specxtype == 1) dam *= 0.3; if (IS_SET (victim->mflags, MAGE_BETTERBODY)) dam *= .85; if (IS_AFFECTED (victim, AFF_PROTECT) && IS_EVIL (ch) && dam > 1) dam -= (dam * 0.25); if (IS_GAR1 (victim, WOLF_COCOON) && IS_CLASS (victim, CLASS_WEREWOLF)) dam -= dam * 0.25; if (IS_CLASS (victim, CLASS_NINJA) && victim->pcdata->powers[NPOWER_CHIKYU] > 6) dam -= dam * 0.45; if (IS_GAR1 (victim, WW_GRANITE) && IS_CLASS (victim, CLASS_FAE)) dam *= 0.40; if (dam < 0) dam = 0; /* * Check for disarm, trip, parry, and dodge. */ if (dt >= TYPE_HIT) { if (check_parry (ch, victim, dt)) return 0; if (!IS_NPC (victim) && IS_STANCE (victim, STANCE_CRANE) && victim->stance[STANCE_CRANE] > 100 && !can_counter (ch) && !can_bypass (ch, victim) && check_parry (ch, victim, dt)) return 0; else if (!IS_NPC (victim) && IS_STANCE (victim, STANCE_MANTIS) && victim->stance[STANCE_MANTIS] > 100 && !can_counter (ch) && !can_bypass (ch, victim) && check_parry (ch, victim, dt)) return 0; if (check_dodge (ch, victim, dt)) return 0; if (!IS_NPC (victim) && IS_STANCE (victim, STANCE_MONGOOSE) && victim->stance[STANCE_MONGOOSE] > 100 && !can_counter (ch) && !can_bypass (ch, victim) && check_dodge (ch, victim, dt)) return 0; else if (!IS_NPC (victim) && IS_STANCE (victim, STANCE_SWALLOW) && victim->stance[STANCE_SWALLOW] > 100 && !can_counter (ch) && !can_bypass (ch, victim) && check_dodge (ch, victim, dt)) return 0; } } return_result += dam; tail_chain (); return (return_result); } // Kills a target remotely and drops the corpse in the right spot. -- Serenity void raw_kill_remote (CHAR_DATA * victim, CHAR_DATA * ch) { CHAR_DATA *mount; char buf[MSL]; stop_fighting (victim, TRUE); if (IS_NPC(victim) && !IS_NPC(ch)) ch->mkill++; if (!IS_NPC(victim) && IS_NPC(ch)) victim->mdeath++; mmake_corpse_remote (victim, ch); if (victim == quest_target) quest_target = NULL; if (victim == quest_mob) { sprintf (buf, "Oh well, I guess the quest is over, since I am about to DIE!!!!!"); do_qtalk (victim, buf); quest_mob = NULL; } if ((mount = victim->mount) != NULL) { if (victim->mounted == IS_MOUNT) { act ("$n rolls off the corpse of $N.", mount, NULL, victim, TO_ROOM); act ("You roll off the corpse of $N.", mount, NULL, victim, TO_CHAR); } else if (victim->mounted == IS_RIDING) { act ("$n falls off $N.", victim, NULL, mount, TO_ROOM); act ("You fall off $N.", victim, NULL, mount, TO_CHAR); } mount->mount = NULL; victim->mount = NULL; mount->mounted = IS_ON_FOOT; victim->mounted = IS_ON_FOOT; } victim->pIndexData->killed++; kill_table[URANGE (0, victim->level, MAX_LEVEL - 1)].killed++; extract_char (victim, TRUE, FALSE); return; }