/*************************************************************************** * 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. * ***************************************************************************/ /*************************************************************************** * ROM 2.4 is copyright 1993-1995 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@pacinfo.com) * * Gabrielle Taylor (gtaylor@pacinfo.com) * * Brian Moore (rom@rom.efn.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * ***************************************************************************/ /*************************************************************************** * ROT 1.4 is copyright 1996-1997 by Russ Walsh * * By using this code, you have agreed to follow the terms of the * * ROT license, in the file doc/rot.license * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include "merc.h" #include "clan.h" #include "tables.h" #include <math.h> double pow( double x, double y ); /* command procedures needed */ DECLARE_DO_FUN (do_backstab); DECLARE_DO_FUN (do_strangle); DECLARE_DO_FUN (do_layhands); DECLARE_DO_FUN (do_smokebomb); DECLARE_DO_FUN (do_emote); DECLARE_DO_FUN (do_berserk); DECLARE_DO_FUN (do_bash); DECLARE_DO_FUN (do_trip); DECLARE_DO_FUN (do_dirt); DECLARE_DO_FUN (do_flee); DECLARE_DO_FUN (do_kick); DECLARE_DO_FUN (do_side_kick); DECLARE_DO_FUN (do_disarm); DECLARE_DO_FUN (do_get); DECLARE_DO_FUN (do_recall); DECLARE_DO_FUN (do_yell); DECLARE_DO_FUN (do_sacrifice); DECLARE_DO_FUN (do_circle); DECLARE_DO_FUN (do_feed); DECLARE_DO_FUN (do_gouge); DECLARE_DO_FUN (do_vdpi); DECLARE_DO_FUN (do_vdtr); DECLARE_DO_FUN (do_vdth); DECLARE_DO_FUN (do_look); DECLARE_DO_FUN (do_announce); DECLARE_DO_FUN (do_clantalk); DECLARE_DO_FUN (do_twirl); DECLARE_DO_FUN (do_rank); DECLARE_DO_FUN (do_lead); const int vam_str[] = { 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5 }; /* * Local functions. */ void check_assist args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool check_dodge args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool check_dodge_real args ((CHAR_DATA * ch, CHAR_DATA * victim, bool silent)); bool check_parry args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool check_phase args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool check_phase_real args ((CHAR_DATA * ch, CHAR_DATA * victim, bool silent)); bool check_shield_block args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool check_barrier args ((CHAR_DATA * ch, CHAR_DATA * victim)); void dam_message args ((CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt, bool immune)); void dam_message_new args ((CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt, bool immune, int dam_flags)); void death_cry args ((CHAR_DATA * ch)); void group_gain args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool is_safe args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool is_safe_quiet args ((CHAR_DATA * ch, CHAR_DATA * victim)); int xp_compute args((CHAR_DATA * gch, CHAR_DATA * victim, int total_levels, int members)); int align_compute args((CHAR_DATA * gch, CHAR_DATA * victim, int total_levels, int members)); bool is_safe_mock args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool is_voodood args ((CHAR_DATA * ch, CHAR_DATA * victim)); void make_corpse args ((CHAR_DATA * ch, CHAR_DATA * killer)); void one_hit args ((CHAR_DATA * ch, CHAR_DATA * victim, int dt, bool secondary)); void one_hit_mock args ((CHAR_DATA * ch, CHAR_DATA * victim, int dt, bool secondary)); void mob_hit args ((CHAR_DATA * ch, CHAR_DATA * victim, int dt)); void raw_kill args ((CHAR_DATA * victim, CHAR_DATA * killer)); void set_fighting args ((CHAR_DATA * ch, CHAR_DATA * victim)); void disarm args ((CHAR_DATA * ch, CHAR_DATA * victim)); void check_arena args ((CHAR_DATA * ch, CHAR_DATA * victim)); int dambonus args ((CHAR_DATA * ch, CHAR_DATA * victim,int dam, int stance)); bool can_counter args ((CHAR_DATA * ch)); bool can_bypass args ((CHAR_DATA * ch, CHAR_DATA * victim)); static int edam_bonus args ((CHAR_DATA *ch, int damage)); void update_power args((CHAR_DATA *highlander)); void falcon_load args((CHAR_DATA *ch, CHAR_DATA *victim)); void woodsman_twirl args((CHAR_DATA * ch, char *argument)); void part_create args((CHAR_DATA *ch, char *argument)); int add_bonuses args(( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt, int dam_type )); char debugbuf[MSL]; int add_damroll args((CHAR_DATA *ch, int diceside)); void death_message args((CHAR_DATA *killer, CHAR_DATA *victim)); int check_martial_arts args((CHAR_DATA *ch, CHAR_DATA *victim)); bool check_open_palming args((CHAR_DATA *ch)); void clear_stance_affects args((CHAR_DATA *ch)); bool check_block args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool check_roll args ((CHAR_DATA * ch, CHAR_DATA * victim)); bool check_acrobatics args ((CHAR_DATA * ch, CHAR_DATA * victim)); OBJ_DATA * rand_obj args( ( CHAR_DATA *ch, int mob_level )); int focus_ac args ((CHAR_DATA *ch)); int focus_hit args ((CHAR_DATA *ch)); int focus_sorc args ((CHAR_DATA *ch)); int focus_dam args ((CHAR_DATA *ch)); void improve_toughness args((CHAR_DATA * ch)); bool check_tumble args ((CHAR_DATA *ch, CHAR_DATA *victim, int dt)); void special_move args (( CHAR_DATA *ch, CHAR_DATA *victim )); bool check_deflect args((CHAR_DATA *ch, CHAR_DATA *victim, int dt,int dam)); bool check_counter_defense args((CHAR_DATA *ch,CHAR_DATA *victim,int dt)); char * get_descr_form args((CHAR_DATA *ch,CHAR_DATA *looker, bool get_long)); void do_mutilate args((CHAR_DATA *ch, CHAR_DATA *victim)); int rank_pk args ((CHAR_DATA * ch, CHAR_DATA * victim)); int rank_arena args ((CHAR_DATA * ch, CHAR_DATA * victim)); int chance_pk args ((CHAR_DATA * ch, CHAR_DATA * victim)); int chance_arena args ((CHAR_DATA * ch, CHAR_DATA * victim)); int sorcery_dam args( ( int num, int dice, CHAR_DATA *ch) ); bool check_sorcery args( (CHAR_DATA *ch, int sn) ); void clan_entry_trigger args((CHAR_DATA *ch, sh_int clan)); void show_damage_short args((CHAR_DATA *ch, CHAR_DATA *victim)); void do_fear (CHAR_DATA * ch, CHAR_DATA * victim); bool check_quick_step args((CHAR_DATA *ch, CHAR_DATA *victim)); void check_follow_through args((CHAR_DATA *ch, CHAR_DATA *victim, int dam)); int rounddam = 0; /* * Control the fights going on. * Called periodically by update_handler. */ void violence_update (void) { CHAR_DATA *ch; CHAR_DATA *ch_next; CHAR_DATA *victim; int regenerate=0; for (ch = char_list; ch != NULL; ch = ch_next) { ch_next = ch->next; // Regeneration if( ch->regen_rate != 0 ) { if(ch->regen_rate > 0) { if(is_affected(ch,gsn_target)) regenerate = number_range(ch->regen_rate/2, ch->regen_rate); else regenerate = number_range(1, ch->regen_rate); } else if(ch->regen_rate < 0) regenerate = number_range(1, -ch->regen_rate); if(ch->hit < ch->max_hit) { if(ch->regen_rate > 0) ch->hit = UMIN(ch->hit + regenerate, ch->max_hit); else if(ch->regen_rate < 0) ch->hit = UMIN(ch->hit - regenerate, ch->max_hit); } } // Mana Regeneration if ( ch->mana_regen_rate != 0 ) { if (ch->mana_regen_rate > 0) regenerate = number_range(1, ch->mana_regen_rate*2)/2; else if(ch->mana_regen_rate < 0) regenerate = number_range(1, -ch->mana_regen_rate*2)/2; if (ch->mana < ch->max_mana) { if (ch->mana_regen_rate > 0) ch->mana = UMIN(ch->mana + regenerate, ch->max_mana); else if(ch->mana_regen_rate < 0 ) { ch->mana = UMIN(ch->mana - regenerate, ch->max_mana); ch->mana = ( ch->mana < 0 ? 0 : ch->mana ); } } } /* For subdued players */ if(ch->position <= POS_STUNNED) { ch->hit += number_range(1,2); update_pos( ch ); } /* if(ch->position == POS_DEAD && IS_NPC(ch)) extract_char(ch,TRUE); */ if (ch->fight_timer > 0) ch->fight_timer--; if(ch->shd_aura_timer > 0) { ch->shd_aura_timer--; if(ch->shd_aura_timer == 0) { REMOVE_BIT(ch->shielded_by,SHD_PROTECT_AURA); if (skill_table[gsn_protective_aura].msg_off ) { send_to_char( skill_table[gsn_protective_aura].msg_off, ch ); send_to_char( "\n\r", ch ); } } } if ( IS_NPC(ch) && (ch->pIndexData->vnum == MOB_VNUM_FALCON) && ch->leader != NULL && ch->leader->fighting == NULL) { act( "$n flies upward and out of sight.", ch, NULL, NULL, TO_ROOM); extract_char(ch,TRUE); continue; } if (ch->stunned) { ch->stunned--; if (!ch->stunned) { send_to_char ("You regain your equilibrium.\n\r", ch); act ("$n regains $s equilibrium.", ch, NULL, NULL, TO_ROOM); } continue; } if ((victim = ch->fighting) == NULL || ch->in_room == NULL) continue; if (IS_AWAKE (ch) && 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)) { if (HAS_TRIGGER (ch, TRIG_FIGHT)) mp_percent_trigger (ch, victim, NULL, NULL, TRIG_FIGHT); if (HAS_TRIGGER (ch, TRIG_HPCNT)) mp_hprct_trigger (ch, victim); } /* * Fun for the whole family! */ check_assist (ch, victim); } return; } /* for auto assisting */ void check_assist (CHAR_DATA * ch, CHAR_DATA * victim) { CHAR_DATA *rch, *rch_next; for (rch = ch->in_room->people; rch != NULL; rch = rch_next) { rch_next = rch->next_in_room; if (!IS_NPC(rch) && rch->ghost_timer > 0) continue; // no more abusing meditation and healing trance! if ((IS_AWAKE (rch) && (rch->position >= POS_STANDING)) && rch->fighting == NULL) { if (IS_NPC(rch) && (IS_AFFECTED(rch,AFF_CHARM)) && is_same_group(rch,ch) ) { multi_hit(rch,victim,TYPE_UNDEFINED); continue; } /* quick check for ASSIST_PLAYER */ if (!IS_NPC (ch) && IS_NPC (rch) && IS_SET (rch->off_flags, ASSIST_PLAYERS) && rch->level + 6 > victim->level) { do_emote (rch, "{Rscreams and attacks!{x"); multi_hit (rch, victim, TYPE_UNDEFINED); continue; } /* PCs next */ if (!IS_NPC (ch) || IS_AFFECTED (ch, AFF_CHARM)) { /* This should be taken care of in is_safe() if (!IS_NPC (rch) && !IS_NPC (victim) && (!is_pkill (rch) || !is_pkill (victim)) && !IS_SET (victim->act, PLR_TWIT)) continue; */ if (((!IS_NPC (rch) && IS_SET (rch->act, PLR_AUTOASSIST)) || IS_AFFECTED (rch, AFF_CHARM)) && is_same_group (ch, rch) && !is_safe (rch, victim)) multi_hit (rch, victim, TYPE_UNDEFINED); continue; } /* now check the NPC cases */ if (IS_NPC (ch) && !IS_AFFECTED (ch, AFF_CHARM)) { if ((IS_NPC (rch) && IS_SET (rch->off_flags, ASSIST_ALL)) || (IS_NPC (rch) && rch->group && rch->group == ch->group) || (IS_NPC (rch) && rch->race == ch->race && IS_SET (rch->off_flags, ASSIST_RACE)) || (IS_NPC (rch) && IS_SET (rch->off_flags, ASSIST_ALIGN) && ((IS_GOOD (rch) && IS_GOOD (ch)) || (IS_EVIL (rch) && IS_EVIL (ch)) || (IS_NEUTRAL (rch) && IS_NEUTRAL (ch)))) || (rch->pIndexData == ch->pIndexData && IS_SET (rch->off_flags, ASSIST_VNUM))) { CHAR_DATA *vch; CHAR_DATA *target; int number; if (number_bits (1) == 0) continue; 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) { do_emote (rch, "{Rscreams and attacks!{x"); multi_hit (rch, target, TYPE_UNDEFINED); } } } } } } /* * Do one group of attacks. */ void multi_hit (CHAR_DATA * ch, CHAR_DATA * victim, int dt) { OBJ_DATA *wield; int chance; /*,dam;*/ bool falcon_here = FALSE; bool quick_step; COOLDOWN_DATA *pcd = NULL; /* decrement the wait */ if (ch->desc == NULL) ch->wait = UMAX (0, ch->wait - PULSE_VIOLENCE); /* decrement the cooldowns */ for ( pcd = ch->cooldowns; pcd != NULL; pcd = pcd->next ) { if ( pcd->duration > 1 ) pcd->duration--; else { char buf[MSL]; sprintf( buf, "{W%s is no longer on cooldown.{x\n\r", skill_table[pcd->type].name ); send_to_char( buf , ch ); cooldown_remove( ch, pcd ); } } if (ch->desc == NULL) ch->daze = UMAX (0, ch->daze - PULSE_VIOLENCE); if (ch == victim) { send_to_char("Illegal Target.",ch); return; } quick_step = check_quick_step(ch,victim); /* no attacks for stunnies -- just a check */ if (ch->position < POS_RESTING) return; if (!IS_NPC(ch) && (!str_cmp(class_table[ch->class].name,"hunter")) && ch->fighting == NULL && !IS_SET (ch->plyr, PLAYER_NOFALCON)) { falcon_load (ch, victim); falcon_here = TRUE; } if (IS_NPC (ch)) { mob_hit (ch, victim, dt); return; } // RE-init as Zero ch->pcdata->round_dam = 0; /* Stance Special Moves */ if (!IS_NPC(ch) && ch->stance[0] > 0 && number_percent() == 1) { int stance = ch->stance[0]; if (ch->stance[stance] >= 200 && is_warrior_class(ch->class)) { special_move(ch,victim); return; } } if(!IS_NPC(ch) && ch->class == CLASS_MONK && is_affected(ch,gsn_multistrike) && (number_percent()*9 < ch->pcdata->learned[gsn_multistrike] )) { check_improve(ch,gsn_multistrike,TRUE,2); act("$n goes into a {RLIGHTNING{x fury of attacks!\n\r",ch,NULL,victim,TO_ROOM); send_to_char("You go into a {RLIGHTNING{x fury of attacks!\n\r",ch); one_hit(ch,victim,gsn_multistrike,FALSE); if (number_percent() < 90) { one_hit(ch,victim,gsn_multistrike,FALSE); } if (number_percent() < 70) { one_hit(ch,victim,gsn_multistrike,FALSE); } if (number_percent() < 50) { one_hit(ch,victim,gsn_multistrike,FALSE); } } /* ---------- THE LINE ------ GOING BACK TO REAL COMBAT --BEGIN----- */ // First Hit -- Everyone Gets One one_hit( ch, victim, dt, FALSE ); if(quick_step) // For normal attack one_hit(ch,victim,dt, FALSE); if (ch->fighting != victim) return; if (IS_AFFECTED(ch,AFF_HASTE)) one_hit(ch,victim,dt, FALSE); if (ch->fighting != victim) return; do_fear(ch,victim); // Second Hit chance = get_skill(ch,gsn_second_attack); chance -= chance/3; if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(is_affected(ch, gsn_concentration)) { chance += 5; } if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if ( number_percent( ) < chance ) { one_hit( ch, victim, dt, FALSE); if(quick_step) // For 2nd Attack one_hit(ch,victim,dt, FALSE); check_improve(ch,gsn_second_attack,TRUE,5); if ( ch->fighting != victim ) return; do_fear(ch,victim); } if ( ch->fighting != victim || dt == gsn_backstab || dt == gsn_ambush || dt == gsn_circle || dt == gsn_twirl || dt == gsn_garrote ) { //show_damage_short(ch, victim); return; } // Second Dual chance = get_skill(ch,gsn_dual_wield)/2; //65% with mastery 50% without if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)) chance *= 2; if(is_affected(ch, gsn_concentration)) chance += 5; if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if (get_eq_char(ch,WEAR_SECONDARY) != NULL && ch->pcdata->learned[gsn_second_attack] > 10) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); check_improve(ch,gsn_dual_wield,TRUE,3); if (ch->fighting != victim) return; do_fear(ch,victim); } else check_improve(ch,gsn_dual_wield,FALSE,3); } // Third chance = get_skill(ch,gsn_third_attack)/2; if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)) chance *= 2; if(is_affected(ch, gsn_concentration)) chance += 5; if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if ( number_percent( ) < chance ) { one_hit( ch, victim, dt, FALSE ); if(quick_step) // For 3rd attack one_hit(ch,victim,dt, FALSE); check_improve(ch,gsn_third_attack,TRUE,6); if ( ch->fighting != victim ) return; do_fear(ch,victim); } // Third Dual chance = get_skill(ch,gsn_dual_wield)/3; //43% with mastery 33% without if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)) chance *= 2; if(is_affected(ch, gsn_concentration)) chance += 5; if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if (get_eq_char(ch,WEAR_SECONDARY) != NULL && ch->pcdata->learned[gsn_third_attack] > 10) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); check_improve(ch,gsn_dual_wield,TRUE,3); if (ch->fighting != victim) return; do_fear(ch,victim); } else check_improve(ch,gsn_dual_wield,FALSE,3); } /* Martial Arts Placed after third attack for more affect */ wield = get_eq_char(ch,WEAR_WIELD); if( wield == NULL && ch->class == CLASS_MONK && is_affected(ch,gsn_martial_arts)) { int dam = 0; dam = check_martial_arts(ch,victim); if (dam != 0) { damage ( ch, victim, dam, gsn_martial_arts, DAM_BASH, TRUE, 0 ); check_improve(ch,gsn_martial_arts,TRUE,2); } } if( ch->class == CLASS_NINJA && is_affected(ch,gsn_martial_arts)) { int dam = 0; dam = check_martial_arts(ch,victim); if (dam != 0) { damage ( ch, victim, dam*2, gsn_martial_arts, DAM_BASH, TRUE, 0 ); check_improve(ch,gsn_martial_arts,TRUE,2); } } /* Renshai Concentration */ /* if(is_affected(ch, gsn_concentration)) { chance = get_skill(ch,gsn_concentration)/9; if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if (number_percent( ) < chance) { if( ch->move > 35 ) { act("$n skillfully strikes again!",ch,NULL,victim,TO_ROOM); one_hit(ch,victim,gsn_concentration,TRUE); check_improve(ch,gsn_concentration,TRUE,6); ch->move -= 35; if (ch->fighting != victim) return; } } else check_improve(ch,gsn_concentration,FALSE,2); } */ // Fourth chance = get_skill(ch,gsn_fourth_attack)/2; if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)) chance *= 1.75; if(is_affected(ch, gsn_concentration)) chance -= 5; if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if(quick_step) chance += 10; if ( number_percent() < chance ) { one_hit( ch, victim, dt, FALSE ); if(quick_step) // For 4rd attack one_hit(ch,victim,dt, FALSE); check_improve(ch,gsn_fourth_attack,TRUE,6); if (ch->fighting != victim ) return; do_fear(ch,victim); } // Fourth Dual chance = get_skill(ch,gsn_dual_wield); if(chance <= 100) chance /= 6; // 16% without else chance /= 4; //32% with mastery if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)) chance *= 1.5; if(is_affected(ch, gsn_concentration)) chance += 5; if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if (get_eq_char(ch,WEAR_SECONDARY) != NULL && ch->pcdata->learned[gsn_fourth_attack] > 10) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); check_improve(ch,gsn_dual_wield,TRUE,6); if (ch->fighting != victim) return; do_fear(ch,victim); } else check_improve(ch,gsn_dual_wield,FALSE,5); } // Fifth Hit chance = get_skill(ch,gsn_fifth_attack)/2; if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)) chance *= 1.75; if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if ( number_percent() < chance ) { one_hit( ch, victim, dt, FALSE ); check_improve(ch,gsn_fifth_attack,TRUE,6); if (ch->fighting != victim ) return; do_fear(ch,victim); } // Fourth Dual chance = get_skill(ch,gsn_dual_wield); if(chance <= 100) chance /= 10; // 10% without else chance /= 6; //20% with mastery if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)) chance *= 1.5; if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if (get_eq_char(ch,WEAR_SECONDARY) != NULL && ch->pcdata->learned[gsn_fifth_attack] > 10) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); check_improve(ch,gsn_dual_wield,TRUE,6); if (ch->fighting != victim) return; do_fear(ch,victim); } else check_improve(ch,gsn_dual_wield,FALSE,5); } // Sixth Hit chance = get_skill(ch,gsn_sixth_attack)/2; if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)) chance *= 1.75; if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if ( number_percent() < chance ) { one_hit( ch, victim, dt, FALSE ); check_improve(ch,gsn_sixth_attack,TRUE,6); if (ch->fighting != victim ) return; do_fear(ch,victim); } // Fifth Dual chance = get_skill(ch,gsn_dual_wield); if(chance <= 100) chance = 0; // 0 without else chance /= 10; //13% with mastery if (chance != 0) { if (IS_AFFECTED(ch,AFF_SLOW)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)) chance *= 1.5; if (IS_SET(ch->stance_aff,STANCE_AFF_SPEED) && number_percent() < ch->stance[ch->stance[0]] * 0.5) { if (IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED)) chance += 25; else chance += 15; } if (get_eq_char(ch,WEAR_SECONDARY) != NULL && ch->pcdata->learned[gsn_sixth_attack] > 10) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); check_improve(ch,gsn_dual_wield,TRUE,6); if (ch->fighting != victim) return; do_fear(ch,victim); } else check_improve(ch,gsn_dual_wield,FALSE,5); } } if (falcon_here == TRUE) multi_hit( ch->pet, victim, TYPE_UNDEFINED ); /* ---------- THE LINE ------ GOING BACK TO REAL COMBAT --END----- */ /* Damage show if(wield != NULL) { sprintf(buf,"{BYou attack $N with $p {W[%d]{B times for {y[%d]{B damage!{x", count, ch->pcdata->round_dam); sprintf(buf2,"{B$n attacks you with $p {W[%d]{B times for {y[%d]{B damage!{x", count, ch->pcdata->round_dam); } else { sprintf(buf,"{BYou attack $N with your fists {W[%d]{B times for {y[%d]{B damage!{x", count, ch->pcdata->round_dam); sprintf(buf2,"{B$n attacks you with your fists {W[%d]{B times for {y[%d]{B damage!{x", count, ch->pcdata->round_dam); } if (!IS_NPC(ch) && IS_SET(ch->act, PLR_SHORT_COMBAT)) act( buf, ch, wield, victim, TO_CHAR ); if (!IS_NPC(victim) && IS_SET(victim->act, PLR_SHORT_COMBAT)) act( buf2, ch, wield, victim, TO_VICT ); */ show_damage_short(ch, victim); /* if (!IS_NPC(ch) && IS_SET(ch->act, PLR_SHORT_COMBAT)) { rounddam = 0; rounddam = ch->pcdata->round_dam; sprintf(buf,"{BAttacking: {W$N {BDamage Done: {W%d{x{x",rounddam); act( buf, ch, NULL, victim, TO_CHAR ); } if (!IS_NPC(victim) && IS_SET(victim->act, PLR_SHORT_COMBAT)) { rounddam = 0; rounddam = victim->pcdata->round_dam; sprintf(buf2,"{BAttacked by: {W$n {BDamage Taken: {W%d{x{x",rounddam); act( buf2, ch, NULL, victim, TO_CHAR ); } */ return; } void show_damage_short(CHAR_DATA *ch, CHAR_DATA *victim) { char buf[MSL]; char buf2[MSL]; if (!IS_NPC(ch) && IS_SET(ch->act, PLR_SHORT_COMBAT)) { rounddam = 0; rounddam = ch->pcdata->round_dam; sprintf(buf,"{BAttacking: {W$N {BDamage Done: {W%d{x{x",rounddam); act( buf, ch, NULL, victim, TO_CHAR ); } if (!IS_NPC(victim) && IS_SET(victim->act, PLR_SHORT_COMBAT)) { rounddam = 0; rounddam = ch->pcdata->round_dam; sprintf(buf2,"{BAttacked by: {W$n {BDamage Taken: {W%d{x{x",rounddam); act( buf2, ch, NULL, victim, TO_VICT ); } } /* procedure for all mobile attacks */ void mob_hit (CHAR_DATA * ch, CHAR_DATA * victim, int dt) { int chance, number; CHAR_DATA *vch, *vch_next; char buf[MSL]; char buf2[MSL]; int rounddam = 0; if (ch->stunned) return; // RE-init as Zero ch->pIndexData->round_dam = 0; // First Hit -- Everyone Gets One one_hit( ch, victim, dt, FALSE ); if (ch->fighting != victim) return; /* Area attack -- BALLS nasty! */ if (IS_SET (ch->off_flags, OFF_AREA_ATTACK)) { for (vch = ch->in_room->people; vch != NULL; vch = vch_next) { vch_next = vch->next; if ((vch != victim && vch->fighting == ch)) one_hit (ch, vch, dt, FALSE); } } if (IS_AFFECTED(ch,AFF_HASTE) || (IS_SET (ch->off_flags, OFF_FAST) && !IS_AFFECTED (ch, AFF_SLOW))) one_hit(ch,victim,dt, FALSE); if (ch->fighting != victim) return; chance = get_skill(ch,gsn_second_attack)/2; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if ( number_percent( ) < chance ) { one_hit( ch, victim, dt, FALSE ); if ( ch->fighting != victim ) return; } if ( ch->fighting != victim || dt == gsn_backstab || dt == gsn_ambush || dt == gsn_circle || dt == gsn_twirl) return; chance = get_skill(ch,gsn_dual_wield)/2; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if (get_eq_char(ch,WEAR_SECONDARY) != NULL) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); if (ch->fighting != victim) return; } } chance = get_skill(ch,gsn_third_attack)/4; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE) || (IS_SET (ch->off_flags, OFF_FAST) && !IS_AFFECTED (ch, AFF_SLOW))) chance *= 2; if ( number_percent( ) < chance ) { one_hit( ch, victim, dt, FALSE ); if ( ch->fighting != victim ) return; } chance = get_skill(ch,gsn_dual_wield)/4; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE)|| (IS_SET (ch->off_flags, OFF_FAST) && !IS_AFFECTED (ch, AFF_SLOW))) chance *= 2; if (get_eq_char(ch,WEAR_SECONDARY) != NULL) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); if (ch->fighting != victim) return; } } chance = get_skill(ch,gsn_fourth_attack)/5; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE) || (IS_SET (ch->off_flags, OFF_FAST) && !IS_AFFECTED (ch, AFF_SLOW))) chance *= 2; if ( number_percent() < chance ) { one_hit( ch, victim, dt, FALSE ); if (ch->fighting != victim ) return; } chance = get_skill(ch,gsn_dual_wield)/5; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE) || (IS_SET (ch->off_flags, OFF_FAST) && !IS_AFFECTED (ch, AFF_SLOW))) chance *= 2; if (get_eq_char(ch,WEAR_SECONDARY) != NULL) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); if (ch->fighting != victim) return; } } chance = get_skill(ch,gsn_fifth_attack)/5; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE) || (IS_SET (ch->off_flags, OFF_FAST) && !IS_AFFECTED (ch, AFF_SLOW))) chance *= 2; if ( number_percent() < chance ) { one_hit( ch, victim, dt, FALSE ); if (ch->fighting != victim ) return; } chance = get_skill(ch,gsn_dual_wield)/5; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE) || (IS_SET (ch->off_flags, OFF_FAST) && !IS_AFFECTED (ch, AFF_SLOW))) chance *= 2; if (get_eq_char(ch,WEAR_SECONDARY) != NULL) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); if (ch->fighting != victim) return; } } chance = get_skill(ch,gsn_sixth_attack)/5; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE) || (IS_SET (ch->off_flags, OFF_FAST) && !IS_AFFECTED (ch, AFF_SLOW))) chance *= 2; if ( number_percent() < chance ) { one_hit( ch, victim, dt, FALSE ); if (ch->fighting != victim ) return; } chance = get_skill(ch,gsn_dual_wield)/6; if (IS_AFFECTED(ch,AFF_SLOW) && !IS_SET (ch->off_flags, OFF_FAST)) chance /= 2; if(IS_AFFECTED(ch,AFF_HASTE) || (IS_SET (ch->off_flags, OFF_FAST) && !IS_AFFECTED (ch, AFF_SLOW))) chance *= 2; if (get_eq_char(ch,WEAR_SECONDARY) != NULL) { if (number_percent( ) < chance) { one_hit(ch,victim,dt,TRUE); if (ch->fighting != victim) return; } } rounddam = 0; if (!IS_NPC(ch)) rounddam = ch->pcdata->round_dam; else rounddam = ch->pIndexData->round_dam; rounddam = 0; sprintf(buf,"{BAttacking: {W$N {BDamage Done: {W%d{x{x",rounddam); if (!IS_NPC(ch)) rounddam = ch->pcdata->round_dam; else rounddam = ch->pIndexData->round_dam; sprintf(buf2,"{BAttacked by: {W$n {BDamage Taken: {W%d{x{x",rounddam); if (!IS_NPC(ch) && IS_SET(ch->act, PLR_SHORT_COMBAT)) { act( buf, ch, NULL, victim, TO_CHAR ); } if (!IS_NPC(victim) && IS_SET(victim->act, PLR_SHORT_COMBAT)) { act( buf2, ch, NULL, victim, TO_VICT ); } /* oh boy! Fun stuff! */ if (ch->wait > 0) return; number = number_range (0, 2); /* if (number == 1 && IS_SET (ch->act, ACT_MAGE)) { { mob_cast_mage(ch,victim); return; } ; } if (number == 2 && IS_SET (ch->act, ACT_CLERIC)) { { mob_cast_cleric(ch,victim); return; } ; } */ /* now for the skills */ number = number_range (0, 8); switch (number) { case (0): if (IS_SET (ch->off_flags, OFF_BASH)) do_bash (ch, ""); break; case (1): if (IS_SET (ch->off_flags, OFF_BERSERK) && !IS_AFFECTED (ch, AFF_BERSERK)) do_berserk (ch, ""); break; case (2): if (IS_SET (ch->off_flags, OFF_DISARM) || (get_weapon_sn (ch) != gsn_hand_to_hand && (IS_SET (ch->act, ACT_WARRIOR) || IS_SET (ch->act, ACT_VAMPIRE) || IS_SET (ch->act, ACT_THIEF)))) do_disarm (ch, ""); break; case (3): if (IS_SET (ch->off_flags, OFF_KICK)) do_kick (ch, ""); break; case (4): if (IS_SET (ch->off_flags, OFF_KICK_DIRT)) do_dirt (ch, ""); break; case (5): if (IS_SET (ch->off_flags, OFF_TAIL)) { /* do_tail(ch,"") */ ; } break; case (6): if (IS_SET (ch->off_flags, OFF_TRIP)) do_trip (ch, ""); break; case (7): if (IS_SET (ch->off_flags, OFF_CRUSH)) { /* do_crush(ch,"") */ ; } break; case (8): if (IS_SET (ch->off_flags, OFF_BACKSTAB)) { do_backstab (ch, ""); } } } /* * Hit one guy once. */ void one_hit (CHAR_DATA * ch, CHAR_DATA * victim, int dt, bool secondary) { OBJ_DATA *wield,*second; int victim_ac; int thac0; int thac0_00; int thac0_32; int dam = 0; int diceroll; int sn, skill; int dam_type,wdam; bool result; bool show = TRUE; int adice,bdice; //char buf [MAX_STRING_LENGTH]; sn = -1; /* just in case */ if (victim == ch || ch == NULL || victim == NULL) return; if (!IS_NPC(ch) && !IS_NPC(victim) && !is_safe(ch, victim) && !is_safe(victim,ch) && ch != victim) { if(!IN_ARENA(ch) && !IN_ARENA(victim)) { ch->fight_timer = pktimer; victim->fight_timer = pktimer; } } /* * Can't beat a dead char! * Guard against weird room-leavings. */ if (victim->position == POS_DEAD || IS_SET(victim->plyr,PLAYER_GHOST) || ch->in_room != victim->in_room) return; ch->fighting = victim; /* * Figure out the type of `damage message. * if secondary == true, use the second weapon. */ if (!secondary) wield = get_eq_char (ch, WEAR_WIELD); else wield = get_eq_char (ch, WEAR_SECONDARY); if (dt == TYPE_UNDEFINED) { dt = TYPE_HIT; if (wield != NULL && wield->item_type == ITEM_WEAPON) dt += wield->value[3]; else dt += ch->dam_type; } if (dt < TYPE_HIT) if (wield != NULL) dam_type = attack_table[wield->value[3]].damage; else dam_type = attack_table[ch->dam_type].damage; else dam_type = attack_table[dt - TYPE_HIT].damage; if (dam_type == -1 || dt == gsn_kick) dam_type = DAM_BASH; /* get the weapon skill */ sn = get_weapon_sn (ch); skill = 20 + get_weapon_skill (ch, sn); /* * Calculate to-hit-armor-class-0 versus armor. */ if (IS_NPC (ch)) { thac0_00 = 20; thac0_32 = -4; /* as good as a thief */ if (IS_SET (ch->act, ACT_VAMPIRE)) thac0_32 = -20; else if (IS_SET (ch->act, ACT_DRUID)) thac0_32 = 0; else if (IS_SET (ch->act, ACT_RANGER)) thac0_32 = -4; else if (IS_SET (ch->act, ACT_WARRIOR)) thac0_32 = -10; else if (IS_SET (ch->act, ACT_THIEF)) thac0_32 = -4; else if (IS_SET (ch->act, ACT_CLERIC)) thac0_32 = 2; else if (IS_SET (ch->act, ACT_MAGE)) thac0_32 = 6; } else { thac0_00 = class_table[ch->class].thac0_00; thac0_32 = class_table[ch->class].thac0_32; } thac0 = interpolate (ch->level, thac0_00, thac0_32); if (thac0 < 0) thac0 = thac0 / 2; if (thac0 < -5) thac0 = -5 + (thac0 + 5) / 2; thac0 -= GET_HITROLL(ch) * skill / 100; thac0 += 5 * (100 - skill) / 100; if (dt == gsn_backstab) thac0 -= 10 * (100 - get_skill (ch, gsn_backstab)); if (dt == gsn_garrote) thac0 -= 10 * (100 - get_skill (ch, gsn_garrote)); if (dt == gsn_ambush) thac0 -= 10 * (100 - get_skill (ch, gsn_ambush)); if (dt == gsn_circle) thac0 -= 10 * (100 - get_skill (ch, gsn_circle)); if (dt == gsn_twirl) thac0 -= 10 * (100 - get_skill (ch, gsn_twirl)); if (dt == gsn_vital_hit) thac0 -= 15 * (100 - get_skill (ch, gsn_vital_hit)); switch (dam_type) { case (DAM_PIERCE): victim_ac = GET_AC (victim, AC_PIERCE) / 10; break; case (DAM_BASH): victim_ac = GET_AC (victim, AC_BASH) / 10; break; case (DAM_SLASH): victim_ac = GET_AC (victim, AC_SLASH) / 10; break; default: victim_ac = GET_AC (victim, AC_EXOTIC) / 10; break; }; /* ************* Hit Chance affected by AC ************* */ if (victim_ac < -15 && victim_ac > -31) victim_ac = (victim_ac + 15) / 5 - 15; else if (victim_ac < -30 && victim_ac > -41) victim_ac = (victim_ac + 15) / 5 - 20; else if (victim_ac < -40 && victim_ac > -51) victim_ac = (victim_ac + 15) / 5 - 25; else if (victim_ac < -50 && victim_ac > -61) victim_ac = (victim_ac + 15) / 5 - 30; else if (victim_ac < -60 && victim_ac > -71) victim_ac = (victim_ac + 15) / 5 - 35; else if (victim_ac < -70 && victim_ac > -81) victim_ac = (victim_ac + 15) / 5 - 40; else if (victim_ac < -80 && victim_ac > -91) victim_ac = (victim_ac + 15) / 5 - 45; else if (victim_ac < -90 && victim_ac > -101) victim_ac = (victim_ac + 15) / 5 - 50; else if (victim_ac < -100 && victim_ac > -111) victim_ac = (victim_ac + 15) / 5 - 55; else if (victim_ac < -110 && victim_ac > -121) victim_ac = (victim_ac + 15) / 5 - 60; else if (victim_ac < -120 && victim_ac > -131) victim_ac = (victim_ac + 15) / 5 - 65; else if (victim_ac < -130 && victim_ac > -141) victim_ac = (victim_ac + 15) / 5 - 70; else if (victim_ac < -140) victim_ac = (victim_ac + 15) / 5 - 75; /* *************** Added in, 1/12/05 ************** */ /* NIGHTSTALKER ABILITY added by Dusk */ if ( IS_SET( ch->ability_lich, ABILITY_LICH_NIGHTSTALKER) && (vam_str[time_info.hour] != 0) ) { // Day time if ((time_info.hour > 6) && (time_info.hour < 18)) { victim_ac += ((victim_ac * vam_str[time_info.hour]) / 10); } else // Night time { victim_ac -= ((victim_ac * vam_str[time_info.hour]) / 10); } } /* END OF NIGHTSTALKER ABILITY BY DUSK */ if (!can_see (ch, victim)) victim_ac -= 10; if (victim->position < POS_FIGHTING) victim_ac += 4; if (victim->position < POS_RESTING) victim_ac += 6; /* Lets try this... */ /* Damage show if(IS_NPC(ch) && !IS_NPC(victim) && IS_SET(victim->act,PLR_SHORT_COMBAT)) show = FALSE; else if(!IS_NPC(ch) && IS_SET(ch->act, PLR_SHORT_COMBAT)) show = FALSE; else */ show = TRUE; /* * The moment of excitement! */ while ((diceroll = number_bits (5)) >= 20) ; if (diceroll == 0 || (diceroll != 19 && diceroll < thac0 - victim_ac)) { /* Miss. */ damage (ch, victim, 0, dt, dam_type, show, 0); tail_chain (); if (!is_safe(ch,victim)) { improve_stance(ch); } return; } /* * Hit. * Calc damage. */ if (IS_NPC (ch) && (!ch->pIndexData->new_format || wield == NULL)) if (!ch->pIndexData->new_format) { dam = number_range (ch->level / 2, ch->level * 3 / 2); if (wield != NULL) dam += dam / 2; } else { dam = dice (ch->damage[DICE_NUMBER], ch->damage[DICE_TYPE]); } else { if (sn != -1) check_improve (ch, sn, TRUE, 5); if (wield != NULL) { if (wield->clan) { float adlev, inclev; int cntr; adlev = 8; inclev = .01; for (cntr = 0; cntr <= ch->level; cntr++) { adlev += .57; adlev += inclev; inclev += .005; } cntr = (int) adlev; dam = dice (cntr / 3, 3) * skill / 100; } else { adice = wield->value[1]; bdice = wield->value[2]; if (wield->pIndexData->new_format) bdice *= (skill/100); else { adice *= (skill/100); bdice *= (skill/100); } switch (wield->value[0]) { case(WEAPON_SWORD): adice += number_range(-2,2); bdice += number_range(-2,2); break; case(WEAPON_DAGGER): adice += number_range(-3,2); bdice += number_range(-3,2); break; case(WEAPON_SPEAR): adice += number_range(-4,4); bdice += number_range(-4,4); break; case(WEAPON_MACE): adice += number_range(-2,2); bdice += number_range(-2,2); break; case(WEAPON_AXE): adice += number_range(-3,3); bdice += number_range(-3,3); break; case(WEAPON_FLAIL): adice += number_range(-2,2); bdice += number_range(-2,2); break; case(WEAPON_WHIP): adice += number_range(-2,1); bdice += number_range(-2,1); break; case(WEAPON_POLEARM): adice += number_range(-2,2); bdice += number_range(-2,2); break; case(WEAPON_EXOTIC): adice += number_range(-3,1); bdice += number_range(-3,1); break; default: break; } dam = dice(adice,bdice); } if (get_eq_char (ch, WEAR_SHIELD) == NULL) /* no shield = more */ dam = dam * 11 / 10; /* If weapon is 15 levels or more higher than ch */ if (wield->level - ch->level >= 15) dam = (dam*8)/10; else if (wield->level - ch->level >= 5) dam = (dam*9)/10; // Vorpal Weapons /* Chance for Vorpal hit, if miss, then sharp */ if (IS_WEAPON_STAT (wield, WEAPON_VORPAL)) { int percent; if ((percent = number_percent ()) <= (skill / 10)) dam = 2 * dam + (dam * 2 * percent / 50); else if ((percent = number_percent ()) <= (skill / 8)) dam = 2 * dam + (dam * 2 * percent / 100); } // Sharp Weapons else if (IS_WEAPON_STAT (wield, WEAPON_SHARP)) { int percent; if ((percent = number_percent ()) <= (skill / 8)) dam = 2 * dam + (dam * 2 * percent / 100); } if(IS_WEAPON_STAT(wield,WEAPON_TWO_HANDS)) { int percent; percent = number_percent()/2; if(number_percent() < 15) { act("You swing $p in a high arc and come down on $N!",ch,wield,victim,TO_CHAR); act("$n swings $p in a high arc and comes down on $N!",ch,wield,victim,TO_NOTVICT); dam = 1.5 * dam + (dam * 5 * percent / 75); } else { dam = 1.5 * dam + (dam * 1.5 * percent / 90); } } } else { if(((ch->class != CLASS_MONK) && (ch->class != CLASS_NINJA)) || (!is_affected(ch,gsn_martial_arts))) dam = number_range (1 + 4 * skill / 100, 2 * ch->level / 3 * skill / 100); else { int sides, ndice; ndice = 4; //12.5 sides = 5; if (ch->class == CLASS_MONK && ch->level > 100) { ndice = 8; //100 sides = 16; } else if (ch->class == CLASS_MONK && ch->level > 80) { ndice = 8; //90 sides = 15; } else if (ch->class == CLASS_NINJA && ch->level > 100) { ndice = 8; //90 sides = 14; } else if (ch->level > 70) { ndice = 7; //70 sides = 14; } else if (ch->level > 60) { ndice = 7; //63 sides = 11; } else if (ch->level > 40) { ndice = 6; //44 sides = 8; } else if (ch->level > 20) { ndice = 5; //22.5 sides = 7; } dam = number_range (ndice, ndice*sides); // dam = dam - 75; /* New Vital Hit By Dusk */ if(has_skill(ch,gsn_vital_hit) && (is_affected(ch,gsn_martial_arts))) { if((get_skill(ch,gsn_vital_hit) / 10) > number_percent( )) { check_improve(ch,gsn_vital_hit,TRUE, 3); int location; location = number_range(0,6); dt = gsn_vital_hit; AFFECT_DATA af; if ( location == 0 || location == 2 || location == 4 || location == 6 ) { send_to_char("{MYour precise movements have granted a vital hit!{x\n\r",ch); send_to_char("{CTheir precise movements targeted a vital area!{x\n\r",victim); if (location == 0) dam *= 1.10; if (location == 2) dam *= 1.20; if (location == 4) dam *= 1.30; if (location == 6) dam *= 1.40; } else if ( location == 1 && !IS_AFFECTED(victim,AFF_BLIND) ) { if ( !IS_NPC(victim) ) { if ( ( number_percent() + get_curr_stat(victim,STAT_DEX)*3 + victim->pcdata->focus[COMBAT_AGILITY] ) < ( number_percent() + get_skill(ch,gsn_vital_hit) ) ) { send_to_char("{MYour precise movements target their eyes!{x\n\r",ch); send_to_char("{CTheir precise movements targeted your eyes!{x\n\r",victim); af.where = TO_AFFECTS; af.type = gsn_vital_hit; af.level = ch->level; af.duration = 1; af.location = APPLY_HITROLL; af.modifier = ch->level/2 * -1; af.bitvector = AFF_BLIND; affect_to_char (victim, &af); one_hit(ch,victim,gsn_vital_hit,FALSE); } } else if ( ( number_percent() < ( number_percent() + get_skill(ch,gsn_vital_hit) ) ) && IS_NPC(victim) ) { af.where = TO_AFFECTS; af.type = gsn_vital_hit; af.level = ch->level; af.duration = 2; af.location = APPLY_HITROLL; af.modifier = ch->level; af.bitvector = AFF_BLIND; affect_to_char (victim, &af); one_hit(ch,victim,gsn_vital_hit, FALSE); } else { send_to_char("{mThey were able to dodge your vital eye strike!{x\n\r",ch); send_to_char("{mYou dodged their vital eye strike!{x\n\r",victim); dam *= .75; } } else if ( location == 1 && IS_AFFECTED(victim,AFF_BLIND) ) { send_to_char("{MTheir eyes have already been blinded!{x\n\r",ch); send_to_char("{CTheir precise movements inflict pain upon your eyes!{x\n\r",victim); dam *= 1.1; } else if ( location == 3 ) { if ( !IS_NPC(victim) ) { if ( ( number_percent() + get_curr_stat(victim,STAT_CON)*2 + get_curr_stat(victim,STAT_DEX)*2 + ( victim->pcdata->focus[COMBAT_TOUGHNESS] + victim->pcdata->focus[COMBAT_AGILITY] ) /2 ) < ( number_percent() + get_skill(ch,gsn_vital_hit) ) ) { send_to_char("{MYour precise movements targets their hamstrings!{x\n\r",ch); send_to_char("{CTheir precise movements targeted your hamstrings!{x\n\r",victim); dam *= 1.15; DAZE_STATE (victim, PULSE_VIOLENCE); } } else if ( IS_NPC(victim) ) { send_to_char("{MYour precise movements targets their hamstrings!{x\n\r",ch); dam *= 1.15; DAZE_STATE (victim, 2 *PULSE_VIOLENCE); } else { send_to_char("{mYour movements did not cause enough pain on their hamstrings!{x\n\r",ch); send_to_char("{mYour agility and toughness prevailed over their hamstring attempt!{x\n\r",ch); dam *= .75; } } else if ( location == 5 ) { if ( !IS_NPC(victim) ) { if ( ( ( number_percent() + get_curr_stat(victim,STAT_CON)*3 + victim->pcdata->focus[COMBAT_TOUGHNESS] ) < ( number_percent() + get_skill(ch,gsn_vital_hit) ) ) && !IS_NPC(victim) ) { send_to_char("{MYour precise movements targets their solarplexis!{x\n\r",ch); send_to_char("{CTheir precise movements targeted your solarplexis!{x\n\r",victim); dam *= .75; victim->stunned = 1; act("{(You are stunned, and have trouble getting back up!{x",ch,NULL,victim,TO_VICT); act("{.$N is stunned by your vital hit!{x",ch,NULL,victim,TO_CHAR); } } else if ( IS_NPC(victim) ) { send_to_char("{MYour precise movements targets their solarplexis{x\n\r",ch); dam *= 1.50; victim->stunned = 1; act("{.$N is stunned by your vital hit!{x",ch,NULL,victim,TO_CHAR); } else { send_to_char("{mYour vital strike hits their solarplexis but has no effect!{x\n\r",ch); send_to_char("{mTheir vital strike hits your solarplexis but bounces off!{x\n\r",ch); dam *= .75; } } } else check_improve(ch,gsn_vital_hit,FALSE,1); } } } } /* Crusader Sunder Armor Class Ability by Dusk Added 10/10/08 if ( !IS_NPC(ch) && ch->class == CLASS_CRUSADER && IS_SET(ch->ability_crusader,ABILITY_CRUSADER_SUNDER) ) { AFFECT_DATA af,*paf; int acmod=0,factor=0, abonus=0, hfactor=0, sfactor=0,acvic=0,ac=0,hf=0,fbonus=0,hbonus=0,tosunder = 0; int sunderamount = 0; factor = ( get_skill ( ch, gsn_second_attack ) + get_skill ( ch, gsn_third_attack ) + get_skill ( ch, gsn_fourth_attack ) + get_skill ( ch, gsn_fifth_attack ) ) / 2; abonus = ( ch->alignment - victim->alignment ) / 100; hfactor = GET_HITROLL (ch); sfactor = ( ( victim->saving_throw * -1 ) * get_curr_stat( victim, STAT_WIS ) ) / 10; acvic = ( ( GET_AC( victim, AC_PIERCE) + GET_AC( victim, AC_BASH ) + GET_AC( victim, AC_SLASH ) + GET_AC( victim, AC_EXOTIC) ) * -1 ) / 4; hf = hfactor + factor + number_percent(); ac = ( acvic * .75 + number_percent() ) / 2; abonus = ( abonus < 0 ? 0 : abonus ); tosunder = ( hf <= ac ? ( ac - hf ) / 25 : ( ( hf - ac ) / 10 ) *-1 ); acmod = abonus + ( ( hfactor - sfactor ) / 10 ) + number_range( 1, 10 ); acmod = ( acmod < 0 ? 0 : acmod ); if ( !IS_NPC(victim) ) { fbonus = ch->pcdata->focus[MAGIC_ABILITY] - victim->pcdata->focus[MAGIC_DEFENSE]; hbonus = ch->pcdata->focus[COMBAT_AGILITY] - victim->pcdata->focus[COMBAT_DEFENSE]; hbonus = ( hbonus < 0 ? 0 : hbonus ); fbonus = ( fbonus < 0 ? 0 : hbonus ); tosunder = tosunder + hbonus; acmod = abonus + fbonus + ( ( hfactor - sfactor ) / 10 ) + number_range( 1, 10 ); } for ( paf = victim->affected; paf != NULL ; paf = paf->next ) { switch( paf->location ) { case APPLY_AC: sunderamount += paf->modifier; break; } } if ( ( ( tosunder + number_percent() ) >= number_percent() ) && ( ch->mana >= acmod/5 ) && ( acmod != 0 ) && ( sunderamount < ( ( ( acvic * -1 - sunderamount ) * -1) / 2 ) ) ) { sprintf(buf,"{yYour faith favors you! Your sunder raises their ac by {Y%d{y!{x\n\r",acmod); send_to_char( buf, ch ); ch->mana -= ( acmod < 2 && acmod >= 0 ? 1 : acmod/2 ); dam *= 4; af.where = TO_AFFECTS; af.type = gsn_sunder; af.level = ch->level; af.duration = 1; af.location = APPLY_AC; af.modifier = acmod; af.bitvector = 0; affect_join( victim, &af ); } } End of new Crusader Ability Sunder by Dusk */ /* * Bonuses. */ /* Start of Nightstalker Ability by Dusk */ if ( IS_SET( ch->ability_lich, ABILITY_LICH_NIGHTSTALKER ) && (vam_str[time_info.hour] != 0 ) ) { if ((time_info.hour > 6) && (time_info.hour < 18)) { dam -= ((dam * vam_str[time_info.hour]) / 10); } else { dam += ((dam * vam_str[time_info.hour]) / 10); } } /* End of Nightstalker Ability by Dusk */ // Add Bonuses here if (ch->class == CLASS_HIGHLANDER && get_skill(ch, gsn_blademastery) > 0) { int hroll; hroll = number_percent (); if (hroll*7 <= get_skill (ch, gsn_blademastery)) { check_improve (ch, gsn_blademastery, TRUE, 3); dt = gsn_blademastery; dam_type = DAM_SLASH; if(number_percent() < 30) { hroll = number_range(2,ch->pcdata->power[POWER_LEVEL]); if(hroll > 2) { hroll *= 6/7; } dam *= hroll; } } } dam = add_bonuses( ch, victim, dam, dt, dam_type ); if ((dt == gsn_assassinate) && wield != NULL) dam *= 16; if (dt == gsn_garrote) dam *= 14; /* Added bonus for dual wielding daggers for Assassins Dusk */ wield = get_eq_char (ch, WEAR_WIELD); second = get_eq_char (ch, WEAR_SECONDARY); if (second != NULL ) { if ( (dt == gsn_backstab) && (wield->value[0] == WEAPON_DAGGER) && (second->value[0] == WEAPON_DAGGER) && (ch->class == CLASS_ASSASSIN) ) { if (ch->level <= 15) dam *= 2; else if (ch->level <= 31) dam *= 2; else if (ch->level <= 47) dam *= 2; else if (ch->level <= 63) dam *= 2; else if (ch->level <= 79) dam *= 2; else if (ch->level <= 91) dam *= 2; else if (ch->level <= 101) dam *= get_skill(ch,gsn_assassinate)/40; else dam *= get_skill(ch,gsn_assassinate)/40; } else if ( (dt == gsn_backstab) && (wield->value[0] == WEAPON_DAGGER) && (second->value[0] != WEAPON_DAGGER) && (ch->class == CLASS_ASSASSIN) ) { if (ch->level <= 15) dam *= 2; else if (ch->level <= 31) dam *= 2; else if (ch->level <= 47) dam *= 2; else if (ch->level <= 63) dam *= 2; else if (ch->level <= 79) dam *= 2; else if (ch->level <= 91) dam *= 2; else if (ch->level <= 101) dam *= get_skill(ch,gsn_assassinate)/50; else dam *= get_skill(ch,gsn_assassinate)/50; } } /* Removed the CLASS_ASSASSIN check because of above addition of dual wield backstab bonus Dusk */ if ( (dt == gsn_backstab) && (wield != NULL) && (ch->class == CLASS_BARD || ch->class == CLASS_NINJA) ) { if (ch->level <= 15) dam *= 2; else if (ch->level <= 31) dam *= 4; else if (ch->level <= 47) dam *= 6; else if (ch->level <= 63) dam *= 8; else if (ch->level <= 79) dam *= 10; else if (ch->level <= 91) dam *= 12; else if (ch->level <= 101) dam *= 17; else dam *= 15; } else if ((dt == gsn_backstab) && (wield != NULL)) { if (ch->level <= 15) dam *=2; else if (ch->level <=31) dam *=3; else if (ch->level <=47) dam *=5; else if (ch->level <=63) dam *=7; else if (ch->level <=79) dam *=9; else if (ch->level <=91) dam *=11; else if (ch->level <=101) dam *=12; else dam *=13; } if (dt == gsn_circle && wield != NULL) { if (ch->level <= 19) dam *= 2; else if (ch->level <= 39) dam *= 3; else if (ch->level <= 59) dam *= 5; else if (ch->level <= 79) dam *= 7; else if (ch->level <= 101) dam *= 9; else dam *= 12; } if (dt == gsn_vital_hit && wield == NULL) { if (ch->level <= 82) dam *= 4; else if (ch->level <= 92) dam *= 5; else if (ch->level <= 101) dam *= 11/2; else dam *= 6; } if (dt == gsn_twirl && wield != NULL) { if (ch->level <= 29) dam *= 3; else if (ch->level <= 49) dam *= 4; else if (ch->level <= 79) dam *= 5; else if (ch->level <= 101) dam *= 6; else dam *= 10; } if (dt == gsn_ambush && wield != NULL) { if (wield->value[0] != 2) dam *= 3 / 2 + (ch->level / 10); else dam *= 3 / 2 + (ch->level / 8); } dam += GET_MOD_DAMROLL(ch) * UMIN(110,skill)/100; if (!IS_NPC(ch)) if (!str_cmp(class_table[ch->class].name,"monk") || !str_cmp(class_table[ch->class].name,"ninja")) { if (wield == NULL && get_eq_char(ch,WEAR_SECONDARY) == NULL) dam += (dam * 11) / 10; } /* * Fists and Affects -- Monk/Ninja/Voodan */ if (is_affected(ch,gsn_fists_fang) && dt != gsn_backstab && dt != gsn_circle) { if (number_percent() < ( get_skill(ch,gsn_fists_fang) / 3) ) { send_to_char("You lash out with your fangs!\n\r",ch); act("$n strikes with the fangs on his wrists!",ch,0,victim,TO_ROOM); dt = gsn_fists_fang; dam_type = DAM_PIERCE; dam = dam + (dam*1/10); if (!saves_spell(ch->level/ 2,victim,DAM_POISON)) { AFFECT_DATA af; send_to_char("You feel poison running in your blood.\n\r",victim); act("$N is poisoned by your fangs!",ch,0,victim,TO_CHAR); af.where = TO_AFFECTS; af.type = gsn_poison; af.level = ch->level * 5/4; af.duration = ch->level / 4; af.location = APPLY_STR; af.modifier = -1*number_range(1,6); af.bitvector = AFF_POISON; affect_join( victim, &af); } } } if (is_affected(ch,gsn_fists_flame)) { if (number_percent() < ( get_skill(ch,gsn_fists_flame) / 5 ) ) { send_to_char("A flaming aura surrounds your fists!\n\r",ch); act("$n's fists are surrounded by a flaming aura!",ch,0,victim,TO_ROOM); dt = gsn_fists_flame; dam_type = DAM_FIRE; dam = dam + (dam*2/10); //Flaming Flag if ( number_range( 1,2 ) == 2 ) //50% chance (keep in mind fists don't hit every punch) { act("$n is burned by the flames!",victim,0,NULL,TO_ROOM); act("Your flesh is seared by the flames!",victim,0,NULL,TO_CHAR); victim->hit = (victim->hit - 20); //20 hidden bonus damage fire_effect( (void *) victim,ch->level*7/10,dam,TARGET_CHAR); //slightly lower level than weapon flaming update_pos( victim ); } } } if (is_affected(ch,gsn_fists_divinity)) { if (number_percent() < (get_skill(ch,gsn_fists_divinity) / 5)) { send_to_char("A bright aura surrounds your fists!\n\r",ch); act("$n's fists are surrounded by a bright aura!",ch,0,victim,TO_ROOM); dt = gsn_fists_divinity; dam_type = DAM_HOLY; dam = dam + (dam*2/10); //Shocking flag: if (number_range( 1,2 ) == 2) //50% chance { wdam = number_range( 1, ch->level / 5 + 2); act("$n is shocked with holy power!",victim,0,NULL,TO_ROOM); act("You are shocked with divine power!",victim,0,NULL,TO_CHAR); victim->hit = (victim->hit <= wdam ? 1 : victim->hit - wdam); shock_effect(victim, ch->level,dam,TARGET_CHAR); update_pos(victim); } } } if (is_affected(ch,gsn_fists_ice)) { if (number_percent() < (get_skill(ch,gsn_fists_ice) / 5)) { send_to_char("A cold mist surrounds your fists!\n\r",ch); act("$n's fists are surrounded by a cold mist!",ch,0,victim,TO_ROOM); dt = gsn_fists_ice; dam_type = DAM_COLD; dam = dam + (dam*2/10); //Frost Flag if (number_range( 1,2 ) == 2) //50% chance { wdam = number_range( 1, ch->level / 15 + 2); act("$n is frozen by the cold!",victim,0,NULL,TO_ROOM); act("The freezing punch surrounds you with ice!",victim,0,NULL,TO_CHAR); victim->hit = (victim->hit - wdam); cold_effect(victim,ch->level,dam,TARGET_CHAR); update_pos(victim); } } } /* STORM CRIT STRIKE by Bree */ /* if(is_affected(ch, gsn_crit_strike)) { if (number_percent() < (get_skill(ch,gsn_third_attack) / 8)) { dt = gsn_crit_strike; check_improve(ch,gsn_crit_strike,TRUE,6); send_to_char("You land a critical strike!\n\r",ch); act("$n lands a critical strike!", ch, NULL, NULL, TO_ROOM); dam = dam + (dam*4/8); } } */ /* Manuevers by Bree */ /* if(is_affected(ch, gsn_snattack)) { if (number_percent() < (get_skill(ch,gsn_third_attack) / 8)) { dt = gsn_snattack; check_improve(ch,gsn_snattack,TRUE,6); send_to_char("You manuever in for a quick strike!\n\r",ch); act("$n manuevers for a strike!", ch, NULL, NULL, TO_ROOM); dam = dam + (dam*4/8); } } */ /* greed by Bree */ /* if(is_affected(ch, gsn_greed)) { if (number_percent() < (get_skill(ch,gsn_third_attack) / 8)) { dt = gsn_greed; check_improve(ch,gsn_greed,TRUE,6); send_to_char("You see a shiney gold coin and move in for a strike!\n\r",ch); act("$n lunges at $N's coin purse! ", ch, NULL, NULL, TO_ROOM); dam = dam + (dam*4/8); } } */ /* bloodlust by Bree */ /* if(is_affected(ch, gsn_bloodlust)) { if (number_percent() < (get_skill(ch,gsn_third_attack) / 8)) { dt = gsn_bloodlust; check_improve(ch,gsn_bloodlust,TRUE,6); send_to_char("Rage overcomes you as you strike!!\n\r",ch); act("$n smells blood and goes {RI{rN{RS{rA{RN{rE{R!!{X", ch, NULL, NULL, TO_ROOM); dam = dam + (dam*4/8); } } */ /* Shadow ungodly blows by Bree */ /* if(is_affected(ch, gsn_modis_anger)) { if (number_percent() < (get_skill(ch,gsn_second_attack) / 8)) { dt = gsn_modis_anger; check_improve(ch,gsn_modis_anger,TRUE,6); act("$n strikes with the fury of The Shadows!", ch, NULL, NULL, TO_ROOM); dam = dam + (dam*4/8); } } */ /* Conquest Critical Strike */ /* if(is_affected(ch, gsn_divide)) { if (number_percent() < (get_skill(ch,gsn_second_attack) / 8)) { dt = gsn_divide; check_improve(ch,gsn_crit_strike,TRUE,6); send_to_char("You land a Conquering Blow!\n\r",ch); act("$n lands a Conquering Blow!", ch, NULL, NULL, TO_ROOM); dam = dam + (dam*4/8); } } */ /* Vanir Critical Strike */ /* if(is_affected(ch, gsn_vmight)) { if (number_percent() < (get_skill(ch,gsn_third_attack) / 8)) { dt = gsn_vmight; check_improve(ch,gsn_crit_strike,TRUE,6); send_to_char("You land a Vanirian Blow!\n\r",ch); act("$n lands a Vanirian Blow!", ch, NULL, NULL, TO_ROOM); dam = dam + (dam*4/8); } } */ if (ch->class == CLASS_HIGHLANDER && get_skill(ch, gsn_follow_through) > 0) { if (number_percent() < (get_skill(ch,gsn_follow_through) / 5)) { check_follow_through(ch,victim,dam); } } if (is_affected(ch,gsn_fists_acid) && dt != gsn_backstab && dt != gsn_circle) { if (number_percent() < (get_skill(ch,gsn_fists_acid) / 6)) { send_to_char("Your fists flare yellow-green for a moment!\n\r",ch); act("$n's fists flare yellow-green for a moment!",ch,0,victim,TO_ROOM); dt = gsn_fists_acid; dam_type = DAM_ACID; dam = dam + (dam*2/10); } } if (is_affected(ch,gsn_fists_liquid)) { int fisthit; if (number_percent() < (get_skill(ch,gsn_fists_liquid) / 5 )) { fisthit = number_range(1,4); switch( fisthit ) { case 1: send_to_char("Water surrounds your fists!\n\r",ch); act("$n's fists are surrounded by water!",ch,0,victim,TO_ROOM); dam_type = DAM_DROWNING; dam = dam + (dam*3/11);//7% damage boost to compensate for no flag/fists of fury break; case 2: send_to_char("Hot magma surrounds your fists!\n\r",ch); act("$n's fists are surrounded by liquid fire!",ch,0,victim,TO_ROOM); dam_type = DAM_FIRE; dam = dam + (dam*3/11); break; case 3: send_to_char("Cold air surrounds your fists!\n\r",ch); act("$n's fists are surrounded by liquid air!",ch,0,victim,TO_ROOM); dam_type = DAM_COLD; dam = dam + (dam*3/11); break; case 4: send_to_char("Searing acid surrounds your fists!\n\r",ch); act("$n's fists are surrounded by acid!",ch,0,victim,TO_ROOM); dam_type = DAM_ACID; dam = dam + (dam*3/11); break; } dt = gsn_fists_liquid; } } if (is_affected(ch,gsn_fists_claw) && dt != gsn_backstab && dt != gsn_circle) { int percent; if ((percent = number_percent()) <= (get_skill(ch,gsn_fists_claw)/10)) { send_to_char("You lash out with your claws!\n\r",ch); act("$n strikes $N with the claws on his wrists!",ch,0,victim,TO_ROOM); dt = gsn_fists_claw; dam_type = DAM_PIERCE; dam = 2 * dam + (dam * 2.5 * percent / 100); } } if (is_affected(ch,gsn_fists_darkness) && dt != gsn_backstab && dt != gsn_circle) { if (get_eq_char(ch,WEAR_SECONDARY) == NULL)//Single-wield only (voodan skill) { if (number_percent() < (get_skill(ch,gsn_fists_darkness) / 6)) { send_to_char("Shadows surround your fists!\n\r",ch); act("$n's fists are covered by shadows!",ch,0,victim,TO_ROOM); dt = gsn_fists_darkness; dam_type = DAM_NEGATIVE; dam = dam + (dam*3/10);//Slight increase in damage (to help voodan) //Vampiric Flag wdam = number_range( 1, ch->level / 5 + 2); act("$n's life is sucked away!",victim,0,NULL,TO_ROOM); act("You feel your life being sucked away!",victim,0,NULL,TO_CHAR); victim->hit = (victim->hit <= wdam ? 1 : victim->hit - wdam); ch->hit = UMIN(ch->max_hit,ch->hit + wdam); victim->mana = (victim->mana <= (wdam / 4) ? 1 : victim->mana - (wdam / 3)); ch->mana = UMIN(ch->max_mana,ch->mana + (wdam / 2)); update_pos(victim); } } } if (check_open_palming(ch) && is_affected(ch,gsn_martial_arts)) { int percent = number_percent(); int fun = number_range(1,5); act("You hit $N with stunning force!",ch,NULL,victim,TO_CHAR); act("$n hits you with stunning force!",ch,NULL,victim,TO_VICT); act("$n hits $N with stunning force!",ch,NULL,victim,TO_NOTVICT); switch(fun) { case 1: dam_type = DAM_PIERCE; break; case 2: dam_type = DAM_BASH; break; case 3: dam_type = DAM_SLASH; break; case 4: dam_type = DAM_HARM; break; default: dam_type = DAM_BASH; break; } if (ch->level <= 59) dam = 2 * dam + (dam * 2 * percent / 120); else if(ch->level <= 100) dam = 2 * dam + (dam * 2 * percent / 100); else dam = 2 * dam + (dam * 2 * percent / 80); check_improve(ch,gsn_palm,TRUE,2); } /* Renshai Modi's Anger */ if(is_affected(ch, gsn_modis_anger)) { int chance, skill; chance = get_skill(ch,gsn_modis_anger)/10; skill = get_skill(ch,gsn_modis_anger); if( number_percent() < chance ) { if( ch->mana > 20 ) { dam += GET_MOD_DAMROLL(ch) * UMIN(100,skill)/100; dt = gsn_modis_anger; ch->mana -= 20; check_improve(ch,gsn_modis_anger,TRUE,6); act("$n strikes with the anger of Modi!", ch, NULL, NULL, TO_ROOM); } } else check_improve(ch,gsn_concentration,FALSE,1); } if (dam <= 0) dam = 1; result = damage (ch, victim, dam, dt, dam_type, show, 0); /* STORM Critical Strike*/ /* if(is_affected(ch, gsn_crit_strike)) { int chance, skill; chance = get_skill(ch,gsn_crit_strike)/10; skill = get_skill(ch,gsn_crit_strike); if( number_percent() < chance ) { if( ch->mana > 20 ) { dam += GET_MOD_DAMROLL(ch) * UMIN(100,skill)/100; dt = gsn_crit_strike; ch->mana -= 20; check_improve(ch,gsn_crit_strike,TRUE,6); act("$n lands a critacal strike!", ch, NULL, NULL, TO_ROOM); } } else check_improve(ch,gsn_concentration,FALSE,1); } if (dam <= 0) dam = 1; result = damage (ch, victim, dam, dt, dam_type, show, 0);*/ // Toughness if(result) improve_toughness(victim); // Weapon Flags if ( !IS_NPC(ch) && wield != NULL ) { if ( number_range( 1,5 ) == 2 ) { if ( ch->fighting == victim && result ) { if ( IS_WEAPON_STAT(wield, WEAPON_FLAMING) ) { wdam = number_range( 1, wield->level / 15 + 1); act("$n is burned by $p.",victim,wield,NULL,TO_ROOM); act("$p sears your flesh.",victim,wield,NULL,TO_CHAR); victim->hit = (victim->hit <= wdam ? 1 : victim->hit - wdam); fire_effect( (void *) victim,wield->level*3/5,dam,TARGET_CHAR); update_pos( victim ); } if ( IS_WEAPON_STAT(wield, WEAPON_FROST) ) { wdam = number_range( 1, wield->level / 12 + 2); act("$p freezes $n.",victim,wield,NULL,TO_ROOM); act("The cold touch of $p surrounds you with ice.",victim,wield,NULL,TO_CHAR); victim->hit = (victim->hit <= wdam ? 1 : victim->hit - wdam); cold_effect(victim,wield->level,dam,TARGET_CHAR); update_pos(victim); } if ( IS_WEAPON_STAT(wield, WEAPON_VAMPIRIC) ) { wdam = number_range( 1, wield->level / 3 + 2); act("$p draws life from $n.",victim,wield,NULL,TO_ROOM); act("The vile touch of $p draws your life.",victim,wield,NULL,TO_CHAR); victim->hit = (victim->hit <= wdam ? 1 : victim->hit - wdam); ch->hit = UMIN(ch->max_hit,ch->hit + wdam); victim->mana = (victim->mana <= (wdam / 4) ? 1 : victim->mana - (wdam / 3)); ch->mana = UMIN(ch->max_mana,ch->mana + (wdam / 2)); update_pos(victim); } //bree change osmosis if ( IS_WEAPON_STAT(wield, WEAPON_OSMOSIS) ) { wdam = number_range( 1, wield->level / 5 + 2); act("$p draws power from $n.",victim,wield,NULL,TO_ROOM); act("The vile touch of $p draws your power.",victim,wield,NULL,TO_CHAR); victim->hit = (victim->hit <= wdam ? 1 : victim->hit - wdam); ch->hit = UMIN(ch->max_hit,ch->hit + wdam); victim->mana = (victim->mana <= wdam ? 1 : victim->mana - wdam); ch->mana = UMIN(ch->max_mana,ch->mana + (wdam * 2 / 3)); update_pos(victim); } if ( IS_WEAPON_STAT(wield, WEAPON_SHOCKING) ) { wdam = number_range( 1, wield->level / 15 + 2); act("$p shocks $n.",victim,wield,NULL,TO_ROOM); act("The electrified touch of $p shocks you.",victim,wield,NULL,TO_CHAR); victim->hit = (victim->hit <= wdam ? 1 : victim->hit - wdam); shock_effect(victim, wield->level + 10,dam,TARGET_CHAR); update_pos(victim); } if ( IS_WEAPON_STAT(wield, WEAPON_POISON) ) { wdam = number_range( 1, wield->level / 15 + 2); 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); poison_effect(victim, wield->level, dam, TARGET_CHAR); victim->hit = (victim->hit <= wdam ? 1 : victim->hit - wdam); update_pos(victim); } if ( IS_WEAPON_STAT(wield, WEAPON_ACIDIC) ) { wdam = number_range( 1, wield->level / 15 + 2); act("$n screams as $p sears $m.",victim,wield,NULL,TO_ROOM); act("You scream $p's acidic edge sears your flesh.",victim,wield,NULL,TO_CHAR); acid_effect(victim, wield->level, dam, TARGET_CHAR); victim->hit = (victim->hit <= wdam ? 1 : victim->hit - wdam); update_pos(victim); } } } } if(result) { if (ch->fighting == victim) { if (IS_SHIELDED (victim, SHD_ICE)) { if (!IS_SHIELDED (ch, SHD_ICE)) { dam = number_range (20, 25); dt = skill_lookup ("iceshield"); damage (victim, ch, dam, dt, DAM_COLD, TRUE, DF_NOREDUCE | DF_NODODGE | DF_NOPARRY | DF_NOBLOCK); } } if (IS_SHIELDED (victim, SHD_FIRE)) { if (!IS_SHIELDED (ch, SHD_FIRE)) { dam = number_range (20, 25); dt = skill_lookup ("fireshield"); damage (victim, ch, dam, dt, DAM_FIRE, TRUE, DF_NOREDUCE | DF_NODODGE | DF_NOPARRY | DF_NOBLOCK); } } if ( IS_SHIELDED (victim, SHD_SHOCK) ) { if ( !IS_SHIELDED (ch, SHD_SHOCK) ) { dam = number_range (25, 30); dt = skill_lookup ("shockshield"); damage (victim, ch, dam, dt, DAM_LIGHTNING, TRUE, DF_NOREDUCE | DF_NODODGE | DF_NOPARRY | DF_NOBLOCK); if ( ( get_curr_stat( victim, STAT_WIS) + victim->saving_throw ) < ( number_percent() + get_curr_stat( victim, STAT_INT) ) && has_skill(ch, skill_lookup( "shockshield" ) ) ) { if ( con_app[get_curr_stat( ch, STAT_CON)].shock < number_percent() ) { send_to_char("You got zapped by their shockshield!\n\r",ch); act("$n's body go stiff with paralysis from the shockshield!",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch, .5 * PULSE_VIOLENCE); } } } } if ( IS_SHIELDED (victim, SHD_DEATH ) ) { if ( !IS_SHIELDED (ch, SHD_DEATH) ) { int dmax, dmin; dmin = 5 + ((victim->level * 30) / 101); dmax = 10 + ((victim->level * 40) / 101); dam = number_range (dmin, dmax); dt = skill_lookup ("deathshield"); damage (victim, ch, dam, dt, DAM_NEGATIVE, TRUE, DF_NODODGE | DF_NOPARRY | DF_NOBLOCK); victim->hit += dam; } } } } tail_chain (); if (!is_safe(ch,victim)) { improve_stance(ch); } return; } int add_bonuses( CHAR_DATA *ch, CHAR_DATA *victim, int dam, int dt, int dam_type ) { float mult = 1; float reduct = 1; int diceroll; if ( !IS_AWAKE(victim) ) mult += 1; else if (victim->position < POS_FIGHTING) dam = dam * 4 / 3; if ( !IS_NPC(ch) ) { if (ch->class == CLASS_HIGHLANDER && dt == gsn_blademastery) { if(ch->pcdata->power[POWER_LEVEL] != 0) dam += edam_bonus( ch, dam )*(ch->pcdata->power[POWER_LEVEL]+1); else dam += edam_bonus( ch, dam ); } if (ch->class == CLASS_HIGHLANDER && dt == gsn_decapitate) { int hroll; if(ch->pcdata->power[POWER_LEVEL] != 0) dam += edam_bonus( ch, dam ) * (ch->pcdata->power[POWER_LEVEL]+2); else dam += edam_bonus( ch, dam ); diceroll = number_percent (); if (diceroll <= (get_skill (ch, gsn_blademastery)/8)) { hroll = number_range(1,ch->pcdata->power[POWER_LEVEL]); if(hroll > 2) { hroll *= 3; hroll /= 4; } dam *= hroll; dam_type = DAM_OTHER; } } } if ( IS_NPC(ch) && ch->level > 100 ) { mult += ( ch->level / 100 ); reduct += ( ch->level / 90 ); } if ( IS_NPC(victim) && victim->level > 100 ) { mult += ( victim->level / 90 ); reduct += ( victim->level / 100 ); } if (get_skill (ch, gsn_enhanced_damage) > 0) { diceroll = number_percent (); if (diceroll <= get_skill (ch, gsn_enhanced_damage)) { check_improve (ch, gsn_enhanced_damage, TRUE, 6); dam += 1.3*edam_bonus( ch, dam ); } } else { dam *= 7; dam /= 10; } dam *= mult; dam /= reduct; return dam; } /* * Mock hit one guy once. */ void one_hit_mock (CHAR_DATA * ch, CHAR_DATA * victim, int dt, bool secondary) { OBJ_DATA *wield; int victim_ac; int thac0; int thac0_00; int thac0_32; int dam; int diceroll; int sn, skill; int dam_type; bool result; sn = -1; /* just in case */ if (ch == NULL || victim == NULL) return; /* * Can't beat a dead char! * Guard against weird room-leavings. */ if (victim->position == POS_DEAD || ch->in_room != victim->in_room) return; /* * Figure out the type of damage message. * if secondary == true, use the second weapon. */ if (!secondary) wield = get_eq_char (ch, WEAR_WIELD); else wield = get_eq_char (ch, WEAR_SECONDARY); if (dt == TYPE_UNDEFINED) { dt = TYPE_HIT; if (wield != NULL && wield->item_type == ITEM_WEAPON) dt += wield->value[3]; else dt += ch->dam_type; } if (dt < TYPE_HIT) if (wield != NULL) dam_type = attack_table[wield->value[3]].damage; else dam_type = attack_table[ch->dam_type].damage; else dam_type = attack_table[dt - TYPE_HIT].damage; if (dam_type == -1) dam_type = DAM_BASH; /* get the weapon skill */ sn = get_weapon_sn (ch); skill = 20 + get_weapon_skill (ch, sn); /* * Calculate to-hit-armor-class-0 versus armor. */ if (IS_NPC (ch)) { thac0_00 = 20; thac0_32 = -4; /* as good as a thief */ if (IS_SET (ch->act, ACT_VAMPIRE)) thac0_32 = -30; else if (IS_SET (ch->act, ACT_DRUID)) thac0_32 = 0; else if (IS_SET (ch->act, ACT_RANGER)) thac0_32 = -4; else if (IS_SET (ch->act, ACT_WARRIOR)) thac0_32 = -10; else if (IS_SET (ch->act, ACT_THIEF)) thac0_32 = -4; else if (IS_SET (ch->act, ACT_CLERIC)) thac0_32 = 2; else if (IS_SET (ch->act, ACT_MAGE)) thac0_32 = 6; } else { thac0_00 = class_table[ch->class].thac0_00; thac0_32 = class_table[ch->class].thac0_32; } thac0 = interpolate (ch->level, thac0_00, thac0_32); if (thac0 < 0) thac0 = thac0 / 2; if (thac0 < -5) thac0 = -5 + (thac0 + 5) / 2; thac0 -= GET_HITROLL (ch) * skill / 100; thac0 += 5 * (100 - skill) / 100; if (dt == gsn_backstab) thac0 -= 10 * (100 - get_skill (ch, gsn_backstab)); if (dt == gsn_circle) thac0 -= 10 * (100 - get_skill (ch, gsn_circle)); if (dt == gsn_ambush) thac0 -= 10 * (100 - get_skill (ch, gsn_ambush)); switch (dam_type) { case (DAM_PIERCE): victim_ac = GET_AC (victim, AC_PIERCE) / 9; break; case (DAM_BASH): victim_ac = GET_AC (victim, AC_BASH) / 9; break; case (DAM_SLASH): victim_ac = GET_AC (victim, AC_SLASH) / 9; break; default: victim_ac = GET_AC (victim, AC_EXOTIC) / 9; break; }; /* if (victim_ac < -15) victim_ac = (victim_ac + 15) / 5 - 15; */ if (!can_see (ch, victim)) victim_ac -= 4; if (victim->position < POS_FIGHTING) victim_ac += 4; if (victim->position < POS_RESTING) victim_ac += 6; /* * The moment of excitement! */ while ((diceroll = number_bits (5)) >= 20) ; if (diceroll == 0 || (diceroll != 19 && diceroll < thac0 - victim_ac)) { /* Miss. */ damage_mock (ch, victim, 0, dt, dam_type, TRUE); tail_chain (); return; } /* * Hit. * Calc damage. */ if (IS_NPC (ch) && (!ch->pIndexData->new_format || wield == NULL)) if (!ch->pIndexData->new_format) { dam = number_range (ch->level / 2, ch->level * 3 / 2); if (wield != NULL) dam += dam / 2; } else dam = dice (ch->damage[DICE_NUMBER], ch->damage[DICE_TYPE]); else { /*if (sn != -1) check_improve (ch, sn, TRUE, 5); No abusing to spam up weapon skills!*/ if (wield != NULL) { if (wield->clan) { float adlev, inclev; int cntr; adlev = 8; inclev = .01; for (cntr = 0; cntr <= ch->level; cntr++) { adlev += .57; adlev += inclev; inclev += .005; } cntr = (int) adlev; dam = dice (cntr / 3, 3) * skill / 100; } else { if (wield->pIndexData->new_format) dam = dice (wield->value[1], wield->value[2]) * skill / 100; else dam = number_range (wield->value[1] * skill / 100, wield->value[2] * skill / 100); } if (get_eq_char (ch, WEAR_SHIELD) == NULL) /* no shield = more */ dam = dam * 11 / 10; /* sharpness! */ if (IS_WEAPON_STAT (wield, WEAPON_SHARP)) { int percent; if ((percent = number_percent ()) <= (skill / 8)) dam = 2 * dam + (dam * 2 * percent / 100); } } else dam = number_range (1 + 4 * skill / 100, 2 * ch->level / 3 * skill / 100); } /* * Bonuses. */ if (get_skill (ch, gsn_enhanced_damage) > 0) { diceroll = number_percent (); if (diceroll <= get_skill (ch, gsn_enhanced_damage)) { //check_improve (ch, gsn_enhanced_damage, TRUE, 6); // dam += 2 * (dam * diceroll / 300); dam += edam_bonus( ch, dam ); } } if (!IS_AWAKE (victim)) dam *= 2; else if (victim->position < POS_FIGHTING) dam = dam * 3 / 2; if (dt == gsn_backstab && wield != NULL) { if (wield->value[0] != 2) dam *= 2 + (ch->level / 2); else dam *= 2 + (ch->level); } if (dt == gsn_circle && wield != NULL) { if (wield->value[0] != 2) dam *= 2 + (ch->level / 3); else dam *= 2 + (ch->level / 2); } dam += GET_MOD_DAMROLL(ch) * UMIN (100, skill) / 100; if (dam <= 0) dam = 1; result = damage_mock (ch, victim, dam, dt, dam_type, TRUE); tail_chain (); return; } /* * Inflict damage from a hit. */ bool damage (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt, int dam_type, bool show, int flags) { OBJ_DATA *corpse; bool immune = FALSE; int victim_ac=0; //CHAR_DATA *gch; if (victim->position == POS_DEAD) return FALSE; if(skill_table[dt].spell_fun != NULL && skill_table[dt].target == TAR_CHAR_OFFENSIVE) { if(check_sorcery(ch,dt)) { // if(!IS_IMMORTAL(ch)) send_to_char("You feel a surge of magic!\n\r",ch); dam = sorcery_dam(dam,2, ch); } } /* damage reduction */ if (!(flags & DF_NOREDUCE)) { if (dam > 35) dam = (dam - 35) * 7 / 10 + 35; if (dam > 85) dam = (dam - 85) * 7 / 10 + 85; if (dam > 500) dam = (dam - 500) * 7 / 10 + 500; if (dam > 1000) dam = (dam - 1000) * 7 / 10 + 1000; if (dam > 2000) dam = (dam - 2000) * 7 / 10 + 2000; if (dam > 3000) dam = (dam - 3000) * 7 / 10 + 3000; } /* * Stop up any residual loopholes. */ if (dam > 6000 && dt >= TYPE_HIT && ch->level < 106) { bug ("Damage: %d: more than 6000 points!", dam); dam = 6000; if (!IS_IMMORTAL (ch) ) { OBJ_DATA *obj; obj = get_eq_char (ch, WEAR_WIELD); send_to_char ("{cYou {z{Breally{x{c shouldn't cheat.{x\n\r", ch); if (obj != NULL) extract_obj (obj); } } if (victim != ch) { /* * Certain attacks are forbidden. * Most other attacks are returned. */ if (is_safe (ch, victim)) return FALSE; if (victim->position > POS_STUNNED) { if (victim->fighting == NULL) { set_fighting (victim, ch); victim->position = POS_FIGHTING; if (IS_NPC (victim) && HAS_TRIGGER (victim, TRIG_KILL)) mp_percent_trigger (victim, ch, NULL, NULL, TRIG_KILL); } if (victim->timer <= 4) victim->position = POS_FIGHTING; } if (victim->position > POS_STUNNED) { if (ch->fighting == NULL) set_fighting (ch, victim); } } /* * More charm stuff. */ if (victim->master == ch) // Why stop if it is yourself? || ch == victim) stop_follower (victim); /* * Inviso attacks ... not. */ if (IS_SHIELDED (ch, SHD_INVISIBLE)) { if (!can_see(victim,ch)) { dam *= 1.25; send_to_char("You use your concealment to get a surprise attack!\n\r",ch); } affect_strip (ch, gsn_invis); affect_strip (ch, gsn_mass_invis); REMOVE_BIT (ch->shielded_by, SHD_INVISIBLE); act ("$n fades into existence.", ch, NULL, NULL, TO_ROOM); } if(is_affected(ch,gsn_hide)) { if (!can_see(victim,ch)) { dam *= 1.25; send_to_char("You use your concealment to get a surprise attack!\n\r",ch); } affect_strip(ch,gsn_hide); act( "$n leaps from $s concealment.", ch, NULL, NULL, TO_ROOM ); } if(IS_AFFECTED(ch,AFF_HIDE)) { if (!can_see(victim,ch)) { dam *= 1.25; 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_affected(ch,gsn_forest_blend)) { if (!can_see(victim,ch)) { dam *= 1.5; send_to_char("You use your concealment to get a surprise attack!\n\r",ch); } affect_strip(ch,gsn_forest_blend); act( "$n leaps from $s concealment.", ch, NULL, NULL, TO_ROOM ); } if(is_affected(ch,gsn_earthmeld)) { if (!can_see(victim,ch)) { dam *= 1.5; send_to_char("You use your concealment to get a surprise attack!\n\r",ch); } affect_strip(ch,gsn_earthmeld); act( "$n pops up from the ground!", ch, NULL, NULL, TO_ROOM ); } /* * Damage modifiers. */ if (dam > 1 && !IS_NPC (victim) && victim->pcdata->condition[COND_DRUNK] > 10) dam = 9 * dam / 10; if (dam > 1 && IS_SHIELDED (victim, SHD_SANCTUARY)) dam -= dam/3; // Toughness if (dam > 1 && is_warrior_class(victim->class) && number_percent() < victim->toughness * 0.35) dam -= dam * (float)((victim->toughness/5)/34)/10; if (dam > 1 && ((IS_SHIELDED (victim, SHD_PROTECT_EVIL) && IS_EVIL (ch)) || (IS_SHIELDED (victim, SHD_PROTECT_GOOD) && IS_GOOD (ch)))) dam -= dam / 5; if (dam > 1 && (IS_SHIELDED (victim, SHD_STONE))) dam -= dam / 10; if (dam > 1 && (IS_SHIELDED (victim, SHD_STEEL))) dam -= dam / 10; /* Check for will of iron */ if( is_affected(victim,gsn_will_of_iron) && number_percent() < 40) { if (is_affected(victim,gsn_martial_arts)) { dam -= dam/5; } else { dam -= dam/3; } } /* * Parry, Shield Block, Dodge, Phase. * Block, Roll, Acrobatics */ if (dt >= TYPE_HIT && ch != victim) { if (!(flags & DF_NOPARRY) && (check_parry (ch, victim))) return FALSE; if((victim->class == CLASS_MONK) && (is_affected(victim,gsn_martial_arts))) { if (check_deflect(ch,victim,dt,dam)) return FALSE; } if (!(flags & DF_NOBLOCK) && (check_shield_block (ch, victim))) return FALSE; if (check_barrier (ch, victim)) return FALSE; if (!(flags & DF_NODODGE) && (check_dodge (ch, victim))) return FALSE; if (check_phase (ch, victim)) return FALSE; if (!(flags & DF_NOPARRY) && check_roll(ch, victim)) return FALSE; if (!(flags & DF_NODODGE) && check_acrobatics(ch, victim)) return FALSE; } switch (check_immune(victim, dam_type)) { case (IS_IMMUNE): dam = 0; break; case (IS_RESISTANT): dam -= dam/3.5 + number_range(dam/8,dam/12); break; case (IS_VULNERABLE): dam += dam/3.5 + number_range(dam/8,dam/12); break; } // AC if(dam_type == DAM_BASH) victim_ac = GET_AC(victim,AC_BASH); else if(dam_type == DAM_SLASH) victim_ac = GET_AC(victim,AC_SLASH); else if(dam_type == DAM_PIERCE) victim_ac = GET_AC(victim,AC_PIERCE); else victim_ac = GET_AC(victim,AC_EXOTIC); /* if(victim->class == CLASS_HIGHLANDER) { dam -= dam * (-victim_ac * .00025); } else { dam -= dam * (-victim_ac * .0004375); } */ // Sorn - New Damage Reduction if(victim->class == CLASS_HIGHLANDER || victim->class == CLASS_MONK) { if(victim_ac < -1729) { dam -= dam * UMIN(.7,-victim_ac*.0002); } else { dam -= dam * ((-victim_ac-((-victim_ac*-victim_ac*3.0)/12100.0))*.00035); } } else { if(victim_ac < -1900) { dam -= dam * UMIN(.7,-victim_ac*.0003); } else { dam -= dam * ((-victim_ac-((-victim_ac*-victim_ac*2.0)/12100.0))*.0004375); } } if(IS_SET(ch->stance_aff,STANCE_AFF_AGGRESSIVE) && number_percent() < ch->stance[ch->stance[0]] * 0.4) { if(IS_SET(ch->stance_aff,STANCE_AFF_DOUBLE_POWER)) dam += dam * 0.12; else dam += dam * 0.10; } if(IS_SET(victim->stance_aff,STANCE_AFF_IMPROVED_DEFENSE) && number_percent() < victim->stance[victim->stance[0]] * 0.5) { dam -= dam * 0.15; } if ( dam < 0 ) dam = 0; /* Do Check for Targetting Here */ /* if(!IS_NPC(ch) && !IS_NPC(victim)) { for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) { if(IS_NPC(gch) || gch == ch) continue; if (is_same_group (gch, ch) && !str_cmp(gch->pcdata->target,victim->name) && (victim->hit - dam) < 0 && !IN_ARENA(ch)) { // No hit...Wait for the Assassination return FALSE; } } } */ /* change killer */ if(dt == gsn_whip && show) { dam_message_new(ch, victim, dam, dt, immune, DMF_WHIP); rounddam += dam; } else { if (show) dam_message (ch, victim, dam, dt, immune); rounddam+= dam; } if(!IS_NPC(ch)) ch->pcdata->round_dam += dam; if(IS_NPC(ch)) ch->pIndexData->round_dam += dam; if (dam == 0) return FALSE; /* * Hurt the victim. * Inform the victim of his new state. */ victim->hit -= dam; if (!IS_NPC (victim) && victim->level >= LEVEL_IMMORTAL && victim->hit < 1 && !IS_SET(victim->in_room->room_flags, ROOM_ARENA)) victim->hit = 1; update_pos (victim); if(victim->hit < 1 && dt == gsn_poison && IS_NPC(victim)) victim->position = POS_MORTAL; if (dt == gsn_feed) { ch->hit = UMIN (ch->hit + ((dam / 3) * 2), ch->max_hit); update_pos (ch); } #if 0 /* If POS_MORTAL, POS_INCAP, or POS_DEAD and in arena, do arena stuff */ if ((arena == FIGHT_BUSY) && (victim->position < POS_STUNNED)) { check_arena (ch, victim); return TRUE; } #endif if(!IS_NPC(victim) && !IS_NPC(ch)) { if(IS_SET(ch->plyr,PLAYER_SUBDUE)) switch( victim->position ) { case POS_MORTAL: act( "You May DECAPITATE $N now!",ch,NULL, victim, TO_CHAR); act ("{c$n is mortally wounded, and will die soon, if not aided.{x", victim, NULL, NULL, TO_ROOM); send_to_char ("{cYou are mortally wounded, and will die soon, if not aided.{x\n\r", victim); break; case POS_INCAP: act ("{c$n is incapacitated and will slowly die, if not aided.{x", victim, NULL, NULL, TO_ROOM); send_to_char ( "{cYou are incapacitated and will slowly {z{Rdie{x{c, if not aided.{x\n\r", victim); break; case POS_STUNNED: act ("{c$n is stunned, but will probably recover.{x", victim, NULL, NULL, TO_ROOM); send_to_char ("{cYou are stunned, but will probably recover.{x\n\r", victim); break; default: if(victim->hit <= -11) { send_to_char("You are mortally wounded, and will die soon, if not aided.\n\r",victim ); stop_fighting( ch, TRUE ); victim->hit = -10; victim->position = POS_MORTAL; } break; } } else /* This now handles cases where Ch or Victim is NPC */ { switch (victim->position) { case POS_MORTAL: act ("{c$n is mortally wounded, and will die soon, if not aided.{x", victim, NULL, NULL, TO_ROOM); send_to_char ("{cYou are mortally wounded, and will die soon, if not aided.{x\n\r", victim); break; case POS_INCAP: act ("{c$n is incapacitated and will slowly die, if not aided.{x", victim, NULL, NULL, TO_ROOM); send_to_char ( "{cYou are incapacitated and will slowly {z{Rdie{x{c, if not aided.{x\n\r", victim); break; case POS_STUNNED: act ("{c$n is stunned, but will probably recover.{x", victim, NULL, NULL, TO_ROOM); send_to_char ("{cYou are stunned, but will probably recover.{x\n\r", victim); break; case POS_DEAD: /* if ((IS_NPC(victim)) && ( victim->die_descr[0] != '\0')) { act( "{c$n $T{x", victim, 0, victim->die_descr, TO_ROOM ); } else { */ act ("{c$n is {CDEAD!!{x", victim, 0, 0, TO_ROOM); /* } */ send_to_char ("{cYou have been {RKILLED!!{x\n\r\n\r", victim); break; default: if (dam > victim->max_hit / 10) send_to_char ("{cThat really did {RHURT!{x\n\r", victim); if (victim->hit < victim->max_hit / 4) send_to_char ("{cYou sure are {z{RBLEEDING!{x\n\r", 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), ch->in_room->vnum); log_string (log_buf); } if(dt == gsn_decapitate) { // Put severed part here. } /* * Death Trigger */ if (IS_NPC (victim) && HAS_TRIGGER (victim, TRIG_DEATH)) { victim->position = POS_STANDING; mp_percent_trigger (victim, ch, NULL, NULL, TRIG_DEATH); } if(!IS_NPC(ch) && !IS_NPC(victim) && is_pkill(ch) && is_pkill(victim) && victim->pcdata->bounty > 0 && !str_cmp(ch->pcdata->target,victim->name) && !(IN_ARENA(ch) || IN_ARENA(victim))) { do_mutilate(ch,victim); } raw_kill (victim, ch); /* dump the flags */ if (ch != victim && !IS_NPC (ch) && (!is_same_clan (ch, victim) || clan_table[victim->clan].independent)) { if (IS_SET (victim->act, PLR_TWIT)) REMOVE_BIT (victim->act, PLR_TWIT); } /* RT new auto commands */ if (!IS_NPC (ch) && IS_NPC (victim)) { OBJ_DATA *coins; corpse = get_obj_list (ch, "corpse", ch->in_room->contents); if (IS_SET (ch->act, PLR_AUTOLOOT) && corpse && corpse->contains) /* exists and not empty */ do_get (ch, "all corpse"); if (IS_SET (ch->act, PLR_AUTOGOLD) && corpse && corpse->contains && /* exists and not empty */ !IS_SET (ch->act, PLR_AUTOLOOT)) { if ((coins = get_obj_list (ch, "gcash", corpse->contains)) != NULL) do_get (ch, "all.gcash corpse"); } if (IS_SET (ch->act, PLR_AUTOSAC)) { if (IS_SET (ch->act, PLR_AUTOLOOT) && corpse && corpse->contains) return TRUE; /* leave if corpse has treasure */ else do_sacrifice (ch, "corpse"); } } return TRUE; } if (victim == ch) return TRUE; /* * Take care of link dead people. */ if (!IS_NPC (victim) && victim->desc == NULL) { if (number_range (0, victim->wait) == 0) { do_recall (victim, ""); return TRUE; } } /* * Wimp out? */ if (IS_NPC (victim) && dam > 0 && victim->wait < PULSE_VIOLENCE / 2) { if ((IS_SET (victim->act, ACT_WIMPY) && number_bits (2) == 0 && victim->hit < victim->max_hit / 5) || (IS_AFFECTED (victim, AFF_CHARM) && victim->master != NULL && victim->master->in_room != victim->in_room)) do_flee (victim, ""); } if (!IS_NPC (victim) && IS_NPC (ch) && victim->hit > 0 && victim->hit <= victim->wimpy && victim->wait < PULSE_VIOLENCE / 2) do_flee (victim, ""); tail_chain (); return TRUE; } /* * Show damage from a mock hit. */ bool damage_mock (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt, int dam_type, bool show) { long immdam; bool immune; char buf1[256], buf2[256], buf3[256]; const char *attack; if (victim->position == POS_DEAD) return FALSE; if (dam > 35) dam = (dam - 35) / 2 + 35; if (dam > 80) dam = (dam - 80) / 2 + 80; if (is_safe_mock (ch, victim)) return FALSE; /* * Damage modifiers. */ if (dam > 1 && !IS_NPC (victim) && victim->pcdata->condition[COND_DRUNK] > 10) dam = 9 * dam / 10; if (dam > 1 && IS_SHIELDED (victim, SHD_SANCTUARY)) dam -= dam/3; // Toughness if (dam > 1 && is_warrior_class(victim->class) && number_percent() < victim->toughness * 0.35) dam -= dam * (float)((victim->toughness/5)/34)/10; if (dam > 1 && ((IS_SHIELDED (victim, SHD_PROTECT_EVIL) && IS_EVIL (ch)) || (IS_SHIELDED (victim, SHD_PROTECT_GOOD) && IS_GOOD (ch)))) dam -= dam / 6; if (dam > 1 && (IS_SHIELDED (victim, SHD_STONE))) dam -= dam / 10; if (dam > 1 && (IS_SHIELDED (victim, SHD_STEEL))) dam -= dam / 10; immune = FALSE; switch (check_immune (victim, dam_type)) { case (IS_IMMUNE): immune = TRUE; dam = 0; break; case (IS_RESISTANT): dam -= dam / 3; break; case (IS_VULNERABLE): dam += dam / 2; break; } if (dt >= 0 && dt < MAX_SKILL) attack = skill_table[dt].noun_damage; else if (dt >= TYPE_HIT && dt <= TYPE_HIT + MAX_DAMAGE_MESSAGE) attack = attack_table[dt - TYPE_HIT].noun; else { bug ("Dam_message: bad dt %d.", dt); dt = TYPE_HIT; attack = attack_table[0].name; } immdam = 0; if (ch->level == MAX_LEVEL) { immdam = dam * 63; } if (ch == victim) { sprintf (buf1, "{y$n's {gmock {B%s{g would have done {R%d hp{g damage to {y$mself{g.{x", attack, dam); sprintf (buf2, "{yYour {gmock {B%s{g would have done {R%d hp{g damage to {yyourself{g.{x", attack, dam); act (buf1, ch, NULL, NULL, TO_ROOM); act (buf2, ch, NULL, NULL, TO_CHAR); } else if (ch->level < MAX_LEVEL) { sprintf (buf1, "{y$n's {gmock {B%s{g would have done {R%d hp{g damage to {y$N{g.{x", attack, dam); sprintf (buf2, "{yYour {gmock {B%s{g would have done {R%d hp{g damage to {y$N{g.{x", attack, dam); sprintf (buf3, "{y$n's {gmock {B%s{g would have done {R%d hp{g damage to {yyou{g.{x", attack, dam); act (buf1, ch, NULL, victim, TO_NOTVICT); act (buf2, ch, NULL, victim, TO_CHAR); act (buf3, ch, NULL, victim, TO_VICT); } else { sprintf (buf1, "{y$n's {gmock {B%s{g would have done {R%lu hp{g damage to {y$N{g.{x", attack, immdam); sprintf (buf2, "{yYour {gmock {B%s{g would have done {R%lu hp{g damage to {y$N{g.{x", attack, immdam); sprintf (buf3, "{y$n's {gmock {B%s{g would have done {R%lu hp{g damage to {yyou{g.{x", attack, immdam); act (buf1, ch, NULL, victim, TO_NOTVICT); act (buf2, ch, NULL, victim, TO_CHAR); act (buf3, ch, NULL, victim, TO_VICT); } tail_chain (); return TRUE; } /* * Inflict damage from a hit. */ bool damage_old (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt, int dam_type, bool show) { return damage(ch,victim,dam,dt,dam_type,show,0); return TRUE; } bool is_safe (CHAR_DATA * ch, CHAR_DATA * victim) { if (victim->in_room == NULL || ch->in_room == NULL) return TRUE; if (IS_NPC(ch) && victim->invis_level >= LEVEL_HERO) return TRUE; /* LinkDead */ if (!IS_NPC(victim) && victim->desc == NULL && !IS_NPC(ch) && victim->fighting != ch && ch->fighting != victim) { act("$N is protected from $n by the Aesir.",ch,0,victim,TO_NOTVICT); act("The Aesir protect $N from you.",ch,0,victim,TO_CHAR); return TRUE; } if (victim->fighting == ch || victim == ch) return FALSE; if(IS_SET(victim->plyr,PLAYER_GHOST) && (!IS_NPC(ch))) { act("$N is a ghost, you cannot attack them.",ch,NULL,victim,TO_CHAR); act("The Aesir protects you from $n.",ch,NULL,victim,TO_VICT); act("$N is protected from $n by the immortals.",ch,NULL,victim,TO_NOTVICT); return TRUE; } else if(IS_SET(ch->plyr,PLAYER_GHOST)) { if (!IS_NPC(victim)) { send_to_char("You're a ghost! you can't attack anyone!\n\r",ch); act("The Aesir protects you from $n.",ch,NULL,victim,TO_VICT); act("$N is protected from $n by the immortals.",ch,NULL,victim,TO_NOTVICT); return TRUE; } if (IS_AFFECTED(victim,AFF_CHARM) && victim->master != NULL && !IS_NPC(victim->master)) { send_to_char("You're a ghost! you can't attack anyone!\n\r",ch); act("The Aesir protects you from $n.",ch,NULL,victim,TO_VICT); act("$N is protected from $n by the immortals.",ch,NULL,victim,TO_NOTVICT); return TRUE; } } /* Clan stuff */ if (IS_SET(victim->plyr,PLAYER_ANCIENT_ENEMY)) { if (IS_NPC(ch) && ch->spec_fun == spec_lookup("spec_cloaked_enforcer")) return FALSE; } if (IS_NPC(victim) && victim->spec_fun == spec_lookup("spec_cloaked_enforcer")) return FALSE; /* killing mobiles */ if (IS_NPC (victim)) { /* safe room? */ if (IS_SET (victim->in_room->room_flags, ROOM_SAFE)) { send_to_char ("Not in this room.\n\r", ch); return TRUE; } /* safe room? */ if (IS_SET(victim->in_room->affected_by, ROOM_AFF_SAFE)) { send_to_char ("Not in this room.\n\r", ch); return TRUE; } if (!IS_NPC (ch) && IS_SET (victim->in_room->room_flags, ROOM_CLAN_ENT)) { send_to_char ("Not in this room.\n\r", ch); return TRUE; } if (victim->pIndexData->pShop != NULL) { send_to_char ("The shopkeeper wouldn't like that.\n\r", ch); return TRUE; } if (is_same_clan (ch, victim)) { send_to_char ("You can't fight your own clan members.\n\r", ch); return TRUE; } if (!IS_NPC(ch)) { /* Only in master's PK */ if (IS_AFFECTED(victim,AFF_CHARM) && !can_pkill(ch,victim->master)) { act("The Aesir protect $N from $n.",ch,0,victim,TO_NOTVICT); act("The Aesir protect you from $n.",ch,0,victim,TO_VICT); act("The Aesir protect $N from you.",ch,0,victim,TO_CHAR); return TRUE; } } else { if (IS_AFFECTED(ch,AFF_CHARM) && IS_AFFECTED(victim,AFF_CHARM) && !can_pkill(ch->master,victim->master)) return TRUE; } /* no killing healers, trainers, etc */ if (IS_SET (victim->act, ACT_TRAIN) || IS_SET (victim->act, ACT_PRACTICE) || IS_SET (victim->act, ACT_IS_HEALER) || IS_SET (victim->act, ACT_IS_BANKER) || IS_SET (victim->act, ACT_IS_SATAN) || (victim->spec_fun == spec_lookup ("spec_questmaster")) || IS_SET (victim->act, ACT_IS_PRIEST)) { act ("I don't think $G would approve.", ch, NULL, NULL, TO_CHAR); return TRUE; } /* if (!IS_NPC (ch)) { no pets if (IS_SET (victim->act, ACT_PET)) { act ("But $N looks so cute and cuddly...",ch, NULL, victim, TO_CHAR); return TRUE; } no charmed creatures unless owner if (IS_AFFECTED (victim, AFF_CHARM) && ch != victim->master) { send_to_char ("You don't own that monster.\n\r", ch); return TRUE; } } */ } /* killing players */ else { /* NPC doing the killing */ if (IS_NPC (ch)) { /* safe room check */ if (IS_SET (victim->in_room->room_flags, ROOM_SAFE)) { send_to_char ("Not in this room.\n\r", ch); return TRUE; } /* safe room? */ if (IS_SET(victim->in_room->affected_by, ROOM_AFF_SAFE)) { send_to_char ("Not in this room.\n\r", ch); return TRUE; } /* charmed mobs and pets cannot attack players while owned */ if (IS_AFFECTED (ch, AFF_CHARM) && ch->master != NULL && ch->master->fighting != victim) { send_to_char ("Players are your friends!\n\r", ch); return TRUE; } } /* player doing the killing */ else { if(IS_SET (victim->act, PLR_TWIT)) return FALSE; if (victim->level < 5) { send_to_char("Are you trying to be a newbie killer or something?",ch); return TRUE; } if (IS_AFFECTED (ch, AFF_CHARM) ) { send_to_char ("You have a master now, sit still and listen to them!\n\r", ch); return TRUE; } // no attacking in arena unless named in current challenge if ((IS_SET (victim->in_room->room_flags, ROOM_ARENA)) && (in_current_challenge(ch->name) == 0)) { send_to_char ("You're not involved in the current challenge.\n\r", ch ); return TRUE; } // teammate in arena? if ((IS_SET (victim->in_room->room_flags, ROOM_ARENA)) && (in_current_challenge(ch->name) == in_current_challenge(victim->name))) { send_to_char( "You can't attack your teammates.\n\r", ch ); return TRUE; } // enemy in arena? if ((IS_SET (victim->in_room->room_flags, ROOM_ARENA)) && (in_current_challenge(ch->name) != in_current_challenge(victim->name))) return FALSE; if (!can_pkill(ch, victim)) { act("The Aesir protect $N from $n.",ch,0,victim,TO_NOTVICT); act("The Aesir protect you from $n.",ch,0,victim,TO_VICT); act("The Aesir protect $N from you.",ch,0,victim,TO_CHAR); return TRUE; } if(IS_SET(victim->shielded_by,SHD_PROTECT_AURA) || IS_SET(ch->shielded_by,SHD_PROTECT_AURA)) return TRUE; if (!is_clan (ch)) { send_to_char ("Join a clan if you want to fight players.\n\r", ch); return TRUE; } if (!is_pkill (ch)) { send_to_char ("Your clan does not allow player fighting.\n\r", ch); return TRUE; } if (!is_clan (victim)) { send_to_char ("They aren't in a clan, leave them alone.\n\r", ch); return TRUE; } if (!is_pkill (victim)) { send_to_char ("They are in a no pkill clan, leave them alone.\n\r", ch); return TRUE; } if (is_same_clan (ch, victim) && !(IS_SET (victim->in_room->room_flags, ROOM_ARENA))) { send_to_char ("You can't fight your own clan members.\n\r", ch); return TRUE; } if(victim->fight_timer > 0) return FALSE; if (IS_SET (victim->in_room->room_flags, ROOM_SAFE) && (victim->in_room->vnum == ROOM_ARENA_LOUNGE || victim->in_room->vnum == ROOM_ARENA_HI || victim->in_room->vnum == ROOM_ARENA_LO)) { send_to_char ("Not in this room.\n\r", ch); return TRUE; } /* safe room? */ if (IS_SET (victim->in_room->affected_by, ROOM_AFF_SAFE)) { send_to_char ("Not in this room.\n\r", ch); return TRUE; } if (ch->on_quest) { send_to_char ("Not while you are on a quest.\n\r", ch); return TRUE; } if (victim->on_quest) { send_to_char ("They are on a quest, leave them alone.\n\r", ch); return TRUE; } } } return FALSE; } bool is_safe_quiet (CHAR_DATA * ch, CHAR_DATA * victim) { if (victim->in_room == NULL || ch->in_room == NULL) return TRUE; if (IS_NPC(ch) && victim->invis_level >= LEVEL_HERO) return TRUE; /* LinkDead */ if (!IS_NPC(victim) && victim->desc == NULL && !IS_NPC(ch) && victim->fighting != ch && ch->fighting != victim) { //act("$N is protected from $n by the Aesir.",ch,0,victim,TO_NOTVICT); //act("The Aesir protect $N from you.",ch,0,victim,TO_CHAR); return TRUE; } if (victim->fighting == ch || victim == ch) return FALSE; if(IS_SET(victim->plyr,PLAYER_GHOST) && (!IS_NPC(ch))) { //act("$N is a ghost, you cannot attack them.",ch,NULL,victim,TO_CHAR); //act("The Aesir protects you from $n.",ch,NULL,victim,TO_VICT); //act("$N is protected from $n by the immortals.",ch,NULL,victim,TO_NOTVICT); return TRUE; } else if(IS_SET(ch->plyr,PLAYER_GHOST)) { if (!IS_NPC(victim)) { //send_to_char("You're a ghost! you can't attack anyone!\n\r",ch); //act("The Aesir protects you from $n.",ch,NULL,victim,TO_VICT); //act("$N is protected from $n by the immortals.",ch,NULL,victim,TO_NOTVICT); return TRUE; } if (IS_AFFECTED(victim,AFF_CHARM) && victim->master != NULL && !IS_NPC(victim->master)) { //send_to_char("You're a ghost! you can't attack anyone!\n\r",ch); //act("The Aesir protects you from $n.",ch,NULL,victim,TO_VICT); //act("$N is protected from $n by the immortals.",ch,NULL,victim,TO_NOTVICT); return TRUE; } } /* Clan stuff */ if (IS_SET(victim->plyr,PLAYER_ANCIENT_ENEMY)) { if (IS_NPC(ch) && ch->spec_fun == spec_lookup("spec_cloaked_enforcer")) return FALSE; } if (IS_NPC(victim) && victim->spec_fun == spec_lookup("spec_cloaked_enforcer")) return FALSE; /* killing mobiles */ if (IS_NPC (victim)) { /* safe room? */ if (IS_SET (victim->in_room->room_flags, ROOM_SAFE)) { //send_to_char ("Not in this room.\n\r", ch); return TRUE; } /* safe room? */ if (IS_SET(victim->in_room->affected_by, ROOM_AFF_SAFE)) { //send_to_char ("Not in this room.\n\r", ch); return TRUE; } if (!IS_NPC (ch) && IS_SET (victim->in_room->room_flags, ROOM_CLAN_ENT)) { //send_to_char ("Not in this room.\n\r", ch); return TRUE; } if (victim->pIndexData->pShop != NULL) { //send_to_char ("The shopkeeper wouldn't like that.\n\r", ch); return TRUE; } if (is_same_clan (ch, victim)) { //send_to_char ("You can't fight your own clan members.\n\r", ch); return TRUE; } if (!IS_NPC(ch)) { /* Only in master's PK */ if (IS_AFFECTED(victim,AFF_CHARM) && !can_pkill(ch,victim->master)) { //act("The Aesir protect $N from $n.",ch,0,victim,TO_NOTVICT); //act("The Aesir protect you from $n.",ch,0,victim,TO_VICT); //act("The Aesir protect $N from you.",ch,0,victim,TO_CHAR); return TRUE; } } else { if (IS_AFFECTED(ch,AFF_CHARM) && IS_AFFECTED(victim,AFF_CHARM) && !can_pkill(ch->master,victim->master)) return TRUE; } /* no killing healers, trainers, etc */ if (IS_SET (victim->act, ACT_TRAIN) || IS_SET (victim->act, ACT_PRACTICE) || IS_SET (victim->act, ACT_IS_HEALER) || IS_SET (victim->act, ACT_IS_BANKER) || IS_SET (victim->act, ACT_IS_SATAN) || (victim->spec_fun == spec_lookup ("spec_questmaster")) || IS_SET (victim->act, ACT_IS_PRIEST)) { //act ("I don't think $G would approve.", ch, NULL, NULL, TO_CHAR); return TRUE; } /* if (!IS_NPC (ch)) { no pets if (IS_SET (victim->act, ACT_PET)) { act ("But $N looks so cute and cuddly...",ch, NULL, victim, TO_CHAR); return TRUE; } no charmed creatures unless owner if (IS_AFFECTED (victim, AFF_CHARM) && ch != victim->master) { send_to_char ("You don't own that monster.\n\r", ch); return TRUE; } } */ } /* killing players */ else { /* NPC doing the killing */ if (IS_NPC (ch)) { /* safe room check */ if (IS_SET (victim->in_room->room_flags, ROOM_SAFE)) { //send_to_char ("Not in this room.\n\r", ch); return TRUE; } /* safe room? */ if (IS_SET(victim->in_room->affected_by, ROOM_AFF_SAFE)) { //send_to_char ("Not in this room.\n\r", ch); return TRUE; } /* charmed mobs and pets cannot attack players while owned */ if (IS_AFFECTED (ch, AFF_CHARM) && ch->master != NULL && ch->master->fighting != victim) { //send_to_char ("Players are your friends!\n\r", ch); return TRUE; } } /* player doing the killing */ else { if(IS_SET (victim->act, PLR_TWIT)) return FALSE; if (victim->level < 5) { //send_to_char("Are you trying to be a newbie killer or something?",ch); return TRUE; } if (IS_AFFECTED (ch, AFF_CHARM) ) { //send_to_char ("You have a master now, sit still and listen to them!\n\r", ch); return TRUE; } // no attacking in arena unless named in current challenge if ((IS_SET (victim->in_room->room_flags, ROOM_ARENA)) && (in_current_challenge(ch->name) == 0)) { //send_to_char ("You're not involved in the current challenge.\n\r", ch ); return TRUE; } // teammate in arena? if ((IS_SET (victim->in_room->room_flags, ROOM_ARENA)) && (in_current_challenge(ch->name) == in_current_challenge(victim->name))) { //send_to_char( "You can't attack your teammates.\n\r", ch ); return TRUE; } // enemy in arena? if ((IS_SET (victim->in_room->room_flags, ROOM_ARENA)) && (in_current_challenge(ch->name) != in_current_challenge(victim->name))) return FALSE; if (!can_pkill(ch, victim)) { //act("The Aesir protect $N from $n.",ch,0,victim,TO_NOTVICT); //act("The Aesir protect you from $n.",ch,0,victim,TO_VICT); //act("The Aesir protect $N from you.",ch,0,victim,TO_CHAR); return TRUE; } if(IS_SET(victim->shielded_by,SHD_PROTECT_AURA) || IS_SET(ch->shielded_by,SHD_PROTECT_AURA)) return TRUE; if (!is_clan (ch)) { //send_to_char ("Join a clan if you want to fight players.\n\r", ch); return TRUE; } if (!is_pkill (ch)) { //send_to_char ("Your clan does not allow player fighting.\n\r", ch); return TRUE; } if (!is_clan (victim)) { //send_to_char ("They aren't in a clan, leave them alone.\n\r", ch); return TRUE; } if (!is_pkill (victim)) { //send_to_char ("They are in a no pkill clan, leave them alone.\n\r", ch); return TRUE; } if (is_same_clan (ch, victim) && !(IS_SET (victim->in_room->room_flags, ROOM_ARENA))) { //send_to_char ("You can't fight your own clan members.\n\r", ch); return TRUE; } if(victim->fight_timer > 0) return FALSE; if (IS_SET (victim->in_room->room_flags, ROOM_SAFE) && (victim->in_room->vnum == ROOM_ARENA_LOUNGE || victim->in_room->vnum == ROOM_ARENA_HI || victim->in_room->vnum == ROOM_ARENA_LO)) { //send_to_char ("Not in this room.\n\r", ch); return TRUE; } /* safe room? */ if (IS_SET (victim->in_room->affected_by, ROOM_AFF_SAFE)) { //send_to_char ("Not in this room.\n\r", ch); return TRUE; } if (ch->on_quest) { //send_to_char ("Not while you are on a quest.\n\r", ch); return TRUE; } if (victim->on_quest) { //send_to_char ("They are on a quest, leave them alone.\n\r", ch); return TRUE; } } } return FALSE; } bool is_safe_mock (CHAR_DATA * ch, CHAR_DATA * victim) { if (victim->in_room == NULL || ch->in_room == NULL) return TRUE; if (!IS_NPC (ch) && IS_IMMORTAL (ch)) return FALSE; if (IS_SET (victim->in_room->room_flags, ROOM_SAFE)) { send_to_char ("Not in this room.\n\r", ch); return TRUE; } if (victim->in_room->area->vnum == 61) return TRUE; /* safe room? */ if (IS_SET (victim->in_room->affected_by, ROOM_AFF_SAFE)) { send_to_char ("Not in this room.\n\r", ch); return TRUE; } if (IS_NPC (victim)) { send_to_char ("{RYou can only use this on a player.{x\n\r", ch); return TRUE; } return FALSE; } bool is_voodood (CHAR_DATA * ch, CHAR_DATA * victim) { OBJ_DATA *object; if (ch->level > HERO) return FALSE; object = victim->carrying; return find_voodoo (ch, object); } // search object and any objects in the list after it to find voodoos // matching name of ch. If any containers are found, recurse. // if ch is null, return TRUE if ANY voodoo is found bool find_voodoo (CHAR_DATA * ch, OBJ_DATA * object) { char arg[MAX_INPUT_LENGTH]; while (object != NULL) { if (object->pIndexData->vnum == OBJ_VNUM_VOODOO) { if (ch == NULL) return TRUE; one_argument (object->name, arg); if (!str_cmp (arg, ch->name)) return TRUE; } if ((object->item_type == ITEM_CONTAINER) || (object->item_type == ITEM_CORPSE_NPC) || (object->item_type == ITEM_CORPSE_PC)) { if (find_voodoo (ch, object->contains)) return TRUE; } object = object->next_content; } return FALSE; } bool is_safe_spell (CHAR_DATA * ch, CHAR_DATA * victim, bool area) { return is_safe(ch,victim); return FALSE; } /* * Check for parry. */ bool check_parry (CHAR_DATA * ch, CHAR_DATA * victim) { int chance; int dam; if (!IS_AWAKE (victim)) return FALSE; // No Weapon? Try Block. if(!IS_NPC(victim) && get_eq_char(victim,WEAR_WIELD) == NULL && !has_skill(victim,gsn_parry)) return check_block(ch,victim); /* less parry if blind */ if (IS_AFFECTED (victim, AFF_BLIND)) { int bfsucc; chance = get_skill( victim, gsn_blind_fighting ); chance = (chance)/2; bfsucc= ((number_percent() <= chance)); check_improve(victim, gsn_blind_fighting, bfsucc, 12); if (!bfsucc) return FALSE; } chance = get_skill (victim, gsn_parry) / 2; if (get_eq_char (victim, WEAR_WIELD) == NULL) { if(!IS_NPC(victim)) return FALSE; else chance /= 2; } if (victim->stunned) return FALSE; if (!can_see (ch, victim)) chance /= 2; if(IS_SET(victim->stance_aff,STANCE_AFF_ENHANCED_BLOCK) && number_percent() < victim->stance[victim->stance[0]] * 0.5) chance += 15; if(IS_SET(victim->stance_aff,STANCE_AFF_IMPROVED_BLOCK) && number_percent() < victim->stance[victim->stance[0]] * 0.5) chance += 15; chance -= (GET_HITROLL (ch) * 0.2); chance -= (get_curr_stat (ch, STAT_DEX) - get_curr_stat (victim, STAT_DEX)) * 3; if (number_percent () >= chance + (victim->level - ch->level)/2) return FALSE; // Riposte is Counter-Parry if ( get_skill(ch,gsn_riposte) > 0 && (get_eq_char(ch, WEAR_WIELD) != NULL || get_eq_char(ch, WEAR_SECONDARY) != NULL) ) { chance = get_skill(ch,gsn_riposte)/8; if(can_counter(ch)) chance += 10; if ( chance > number_percent()) { dam = number_range( 20, (ch->level*7) ); act( "You writhe in pain as $N lacerates you.", victim, NULL, ch, TO_CHAR); act( "You slice $n into a bloody lifeless pulp.", victim, NULL, ch, TO_VICT); act( "$N executes a skillful riposte.", victim, NULL, ch, TO_NOTVICT); damage(ch,victim,number_range( dam,(ch->level*10) ),gsn_riposte,DAM_SLASH,TRUE,0); update_pos(victim); check_improve(ch,gsn_riposte,TRUE,1); return FALSE; } else { // Swashbucklers already got counter attempt. check_improve(ch,gsn_riposte,FALSE,1); if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You parry $n's attack.{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N parries your attack.{x", ch, NULL, victim, TO_CHAR); check_improve (victim, gsn_parry, TRUE, 6); return TRUE; } } // Stance Counter if(can_counter(ch)) { if(number_percent() < 15) { dam = number_range( 20, (ch->level*3) ); act( "$n counters your parry!", ch, NULL, victim, TO_VICT); act( "You counter $N's parry and strike $M.", ch, NULL, victim, TO_CHAR); act( "$N counters $n's parry.", victim, NULL, ch, TO_NOTVICT); damage(ch,victim,number_range( dam,(ch->level*5) ),gsn_parry,DAM_SLASH,TRUE,0); update_pos(victim); return FALSE; } } if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You parry $n's attack.{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N parries your attack.{x", ch, NULL, victim, TO_CHAR); check_improve (victim, gsn_parry, TRUE, 6); return TRUE; } //Barrier - Fesdor bool check_barrier (CHAR_DATA * ch, CHAR_DATA * victim) { int chance; if (is_affected(victim,skill_lookup("barrier"))) //no gsn available for barrier { if (!IS_AWAKE (victim)) return FALSE; chance = 35; if (get_curr_stat (victim, STAT_CON) > 20) chance += 10; if (get_curr_stat (victim, STAT_INT) > 22) chance += 10; if (get_curr_stat (ch, STAT_STR) > 23) chance -= 5; if (get_curr_stat (ch, STAT_DEX) > 23) chance -= 5; chance -= (GET_HITROLL (ch) * 0.12); chance -= (get_curr_stat (ch, STAT_DEX) - get_curr_stat (victim, STAT_DEX)) * 1.5; chance -= (get_curr_stat (ch, STAT_WIS) - get_curr_stat (victim, STAT_WIS)); chance -= (get_curr_stat (ch, STAT_INT) - get_curr_stat (victim, STAT_INT)) * 2; if(!IS_NPC(ch)) { chance += victim->level - ch->level; chance *= 1.25; } else { chance += victim->level - (ch->level*2/3); chance *= 1.5; } if (victim->stunned) chance = chance/1.3; if (number_percent () >= chance) return FALSE; else if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)Your barrier blocks $n's attack.{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N's personal barrier blocks your attack!{x", ch, NULL, victim, TO_CHAR); return TRUE; } else { return FALSE; } } /* * Check for shield block. */ bool check_shield_block (CHAR_DATA * ch, CHAR_DATA * victim) { int chance, dam; if (!IS_AWAKE (victim)) return FALSE; /* less shield block if blind */ if (IS_AFFECTED (victim, AFF_BLIND)) { int bfsucc; chance = (get_skill( victim, gsn_blind_fighting ))/2; bfsucc= ((number_percent() <= chance)); check_improve(victim, gsn_blind_fighting, bfsucc, 12); if (!bfsucc) return FALSE; } if (get_eq_char(victim, WEAR_SHIELD) == NULL) return FALSE; chance = get_skill (victim, gsn_shield_block)*2/3; if(IS_SET(victim->stance_aff,STANCE_AFF_ENHANCED_BLOCK) && number_percent() < victim->stance[victim->stance[0]] * 0.5) chance += 15; if(IS_SET(victim->stance_aff,STANCE_AFF_IMPROVED_BLOCK) && number_percent() < victim->stance[victim->stance[0]] * 0.5) chance += 15; chance -= (GET_HITROLL (ch) * 0.15); chance -= (get_curr_stat (ch, STAT_DEX) - get_curr_stat (victim, STAT_DEX)) * 3; chance -= (get_curr_stat (ch, STAT_STR) - get_curr_stat (victim, STAT_STR)) * 2; if(!IS_NPC(ch)) chance += victim->level - ch->level; else chance += victim->level - (ch->level*2/3); if (number_percent () >= chance) return FALSE; if (victim->stunned) return FALSE; /* Swashbuckler Counter-Shield-Block */ if ( get_skill(ch,gsn_coup_de_coup) > 0 && (get_eq_char(ch, WEAR_WIELD) != NULL || get_eq_char(ch, WEAR_SECONDARY) != NULL) ) { chance = get_skill(ch,gsn_coup_de_coup)/7; if(can_bypass(ch,victim)) chance += 15; if( chance > number_percent()) { dam = number_range(20, (ch->level*7) ); act("$n slides past your shield block and impales you!",ch,NULL,victim,TO_VICT); act("You counter $N's shield block and impale $M.",ch,NULL,victim,TO_CHAR); act("$n deftly dances past $N's shield block and impales $N.",ch,NULL,victim,TO_NOTVICT); damage(ch,victim,number_range(dam,(victim->level*7) ), gsn_coup_de_coup, DAM_PIERCE, TRUE, 0); update_pos(victim); check_improve(ch,gsn_coup_de_coup,TRUE,2); return FALSE; } else { check_improve(ch,gsn_coup_de_coup,FALSE,3); if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You block $n's attack with your shield.{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N blocks your attack with a shield.{x", ch, NULL, victim, TO_CHAR); check_improve (victim, gsn_shield_block, TRUE, 6); return TRUE; } } if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You block $n's attack with your shield.{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N blocks your attack with a shield.{x", ch, NULL, victim, TO_CHAR); check_improve (victim, gsn_shield_block, TRUE, 6); return TRUE; } bool check_dodge (CHAR_DATA * ch, CHAR_DATA * victim) { return check_dodge_real(ch,victim,FALSE); } /* * Check for dodge. conquest dodge info */ bool check_dodge_real(CHAR_DATA * ch, CHAR_DATA * victim, bool silent) { int chance, dam; if (!IS_AWAKE (victim)) return FALSE; /* no dodge if blind */ if (IS_AFFECTED (victim, AFF_BLIND)) { int bfsucc; chance = get_skill( victim, gsn_blind_fighting ); chance = (chance * 3) / 5; chance += 25; bfsucc= ((number_percent() <= chance)); check_improve(victim, gsn_blind_fighting, bfsucc, 12); if (!bfsucc) return FALSE; } chance = get_skill (victim, gsn_dodge) / 2; if (!can_see (victim, ch)) chance /= 2; if(!IS_NPC(victim) && victim->class == CLASS_MONK) { if(victim->pcdata->power[1] > number_percent()) chance *= 3/2; } /*conquest dodge start here */ /* if(is_affected(ch, gsn_divide)) { if (number_percent() < (get_skill(ch,gsn_third_attack) / 7)) { send_to_char("You spin to the side and avoid a strike!\n\r",ch); act("$n spins out of the way of the attack!", ch, NULL, NULL, TO_ROOM); return FALSE; } } */ /* Stance Stuff */ if(IS_SET(victim->stance_aff,STANCE_AFF_IMPROVED_DODGE) && number_percent() < victim->stance[victim->stance[0]] * 0.5) chance += 15; chance -= (GET_HITROLL (ch) * 0.2); chance -= (get_curr_stat (ch, STAT_DEX) - get_curr_stat (victim, STAT_DEX)) * 3; if (number_percent () >= chance + (victim->level - ch->level)/2) return FALSE; if (victim->stunned) return FALSE; /* Swashbuckler Counter-Dodge */ if ( get_skill(ch,gsn_coup_de_coup) > 0 && (get_eq_char(ch, WEAR_WIELD) != NULL || get_eq_char(ch, WEAR_SECONDARY) != NULL) ) { chance = get_skill(ch,gsn_coup_de_coup)/5; if(can_bypass(ch,victim)) chance += 15; if( chance > number_percent()) { dam = number_range(20, (ch->level*8) ); act("$n slides past your shield block and impales you!",ch,NULL,victim,TO_VICT); act("You counter $N's shield block and impale $M.",ch,NULL,victim,TO_CHAR); act("$n deftly dances past $N's shield block and impales $N.",ch,NULL,victim,TO_NOTVICT); damage(ch,victim,number_range(dam,(victim->level*7) ), gsn_coup_de_coup, DAM_PIERCE, TRUE, 0); check_improve(ch,gsn_coup_de_coup,TRUE,2); return FALSE; } else { check_improve(ch,gsn_coup_de_coup,FALSE,3); if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You dodge $n's attack.{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N dodges your attack.{x", ch, NULL, victim, TO_CHAR); check_improve (victim, gsn_dodge, TRUE, 6); return TRUE; } } if(can_bypass(ch,victim)) { if(number_percent() < 15) { dam = number_range( 20, (ch->level*3) ); act( "$n follows your dodge!", ch, NULL, victim, TO_VICT); act( "You follow $N's dodge and strike $M.", ch, NULL, victim, TO_CHAR); act( "$N follows $n's dodge and strikes $M.", victim, NULL, ch, TO_NOTVICT); damage(ch,victim,number_range( dam,(ch->level*5) ),gsn_dodge,DAM_SLASH,TRUE,0); return FALSE; } } if(!silent) { if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You dodge $n's attack.{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N dodges your attack.{x", ch, NULL, victim, TO_CHAR); } check_improve (victim, gsn_dodge, TRUE, 6); return TRUE; } bool check_phase (CHAR_DATA * ch, CHAR_DATA * victim) { return check_phase_real(ch,victim,FALSE); } bool check_phase_real(CHAR_DATA * ch, CHAR_DATA * victim, bool silent) { int chance; if (!IS_AWAKE (victim)) return FALSE; if(IS_NPC(victim) && !IS_SET(victim->off_flags,OFF_PHASE)) return FALSE; chance = get_skill (victim, gsn_phase) / 2; if(chance == 0) // Class don't have it.... return FALSE; if (!can_see (victim, ch)) chance /= 2; /* Stance Stuff (can_phase) */ chance -= (GET_HITROLL (ch) * 0.1); if (number_percent () >= chance + (victim->level - ch->level)/2) return FALSE; if (victim->stunned) return FALSE; victim->mana -= 5; if(!silent) { if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You phase out and avoid $n's attack.{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N phases out to avoid your attack.{x", ch, NULL, victim, TO_CHAR); } check_improve (victim, gsn_phase, TRUE, 6); return TRUE; } /* * Set position of a victim. */ void update_pos (CHAR_DATA * victim) { if (victim->hit > 0) { if (victim->position <= POS_STUNNED) victim->position = POS_STANDING; return; } if (IS_NPC (victim) && victim->hit < 1) { victim->position = POS_DEAD; 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); // print_log_watch("Set_fighting: already fighting"); return; } if (IS_AFFECTED (ch, AFF_SLEEP)) affect_strip (ch, gsn_sleep); ch->fighting = victim; victim->fighting = ch; ch->position = POS_FIGHTING; ch->stunned = 0; if (!IS_NPC(ch) && !IS_NPC(victim) && !IN_ARENA(ch)) { //DESCRIPTOR_DATA *d; char buf[MSL]; /* for ( d = descriptor_list; d != NULL; d = d->next ) { if (d->connected != CON_PLAYING) continue; sprintf ( buf, "{3[{DShadow{WLight{3]{x %s was attacked by %s at %s in %s.\n\r", ch->name, victim->name, ch->in_room->name, ch->in_room->area->name ); if (d->character->clan == clan_lookup("order")) { send_to_char( buf, d->character ); } } */ sprintf ( buf, "{3[{DShadow{WLight{3]{V %s was attacked by %s at %s {Vin %s.", ch->name, victim->name, ch->in_room->name, ch->in_room->area->name ); wiznet ( buf, NULL, NULL, WIZ_DEATHS, 0, 0 ); } return; } /* * Stop fights. */ void stop_fighting (CHAR_DATA * ch, bool fBoth) { CHAR_DATA *fch; char buf[MAX_STRING_LENGTH]; COOLDOWN_DATA *fcd = NULL; for (fch = char_list; fch != NULL; fch = fch->next) { if (fch == ch || (fBoth && fch->fighting == ch)) { fch->fighting = NULL; fch->position = IS_NPC (fch) ? fch->default_pos : POS_STANDING; fch->stunned = 0; fch->wait = 0; /* Drop the cooldowns */ if (fch->cooldowns != NULL) { for ( fcd = fch->cooldowns; fcd != NULL; fcd = fcd->next ) { cooldown_remove(fch, fcd); } } update_pos (fch); if (IS_SET (fch->comm, COMM_STORE)) if (fch->tells) { sprintf (buf, "You have {R%d{x tells waiting.\n\r", fch->tells); send_to_char (buf, fch); send_to_char ("Type 'replay' to see tells.\n\r", fch); } } } return; } /* * Make a corpse out of a character. */ void make_corpse (CHAR_DATA * ch, CHAR_DATA * killer) { ROOM_INDEX_DATA *location; char buf[MAX_STRING_LENGTH]; OBJ_DATA *corpse; OBJ_DATA *obj; OBJ_DATA *obj_next; char *name; if (IS_NPC (ch)) { if (IS_SET (ch->act, ACT_NO_BODY)) { if (IS_SET (ch->act, ACT_NB_DROP)) { for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; obj_from_char (obj); if (obj->item_type == ITEM_POTION) obj->timer = number_range (500, 1000); if (obj->item_type == ITEM_SCROLL) obj->timer = number_range (1000, 2500); if (IS_SET (obj->extra_flags, ITEM_ROT_DEATH)) { obj->timer = number_range (10, 15); REMOVE_BIT (obj->extra_flags, ITEM_ROT_DEATH); } REMOVE_BIT (obj->extra_flags, ITEM_VIS_DEATH); if (IS_SET (obj->extra_flags, ITEM_INVENTORY)) extract_obj (obj); act ("$p falls to the floor.", ch, obj, NULL, TO_ROOM); obj_to_room (obj, ch->in_room); } } return; } name = ch->short_descr; corpse = create_object (get_obj_index (OBJ_VNUM_CORPSE_NPC), 0); corpse->timer = number_range (6, 12); if (ch->gold > 0 || ch->platinum > 0) { obj_to_obj (create_money (ch->platinum, ch->gold, ch->silver), corpse); ch->platinum = 0; ch->gold = 0; ch->silver = 0; } corpse->cost = 0; } else { name = ch->name; corpse = create_object (get_obj_index (OBJ_VNUM_CORPSE_PC), 0); corpse->timer = number_range (25, 40); if ((!is_clan (ch)) || (IN_ARENA(ch))) { corpse->owner = str_dup (ch->name); corpse->killer = NULL; } else { corpse->owner = str_dup (ch->name); corpse->killer = str_dup (killer->name); if ((ch->platinum > 1 || ch->gold > 1 || ch->silver > 1) && (!IN_ARENA(ch))) { obj_to_obj (create_money (ch->platinum / 2, ch->gold / 2, ch->silver / 2), corpse); ch->platinum -= ch->platinum / 2; ch->gold -= ch->gold / 2; ch->silver -= ch->silver / 2; } } corpse->cost = 0; } corpse->level = ch->level; corpse->cost = ch->level*200; 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); // in arena, stuff doesn't go into corpse if (ch != NULL && !IN_ARENA(ch)) { for (obj = ch->carrying; obj != NULL; obj = obj_next) { bool floating = FALSE; obj_next = obj->next_content; if (obj->wear_loc == WEAR_FLOAT) floating = TRUE; /* if(str_cmp(obj->owner,ch->name)) */ obj_from_char (obj); if (obj->item_type == ITEM_POTION) obj->timer = number_range (500, 1000); if (obj->item_type == ITEM_SCROLL) obj->timer = number_range (1000, 2500); if (IS_SET (obj->extra_flags, ITEM_ROT_DEATH) && !floating) { obj->timer = number_range (5, 10); REMOVE_BIT (obj->extra_flags, ITEM_ROT_DEATH); } REMOVE_BIT (obj->extra_flags, ITEM_VIS_DEATH); if (obj->item_type == ITEM_PASSBOOK) { change_banklist (ch, FALSE, obj->value[0], obj->value[1], 0, obj->name); extract_obj (obj); } else if (IS_SET (obj->extra_flags, ITEM_INVENTORY)) { extract_obj (obj); } else if (floating) { if (IS_OBJ_STAT (obj, ITEM_ROT_DEATH)) /* get rid of it! */ { if (obj->contains != NULL) { OBJ_DATA *in, *in_next; act ("$p evaporates,scattering its contents.", ch, obj, NULL, TO_ROOM); for (in = obj->contains; in != NULL; in = in_next) { in_next = in->next_content; obj_from_obj (in); obj_to_room (in, ch->in_room); } } else act ("$p evaporates.", ch, obj, NULL, TO_ROOM); extract_obj (obj); } else { if(!IS_NPC(ch)) { act ("$p falls onto $n's corpse.", ch, obj, NULL, TO_ROOM); obj_to_obj(obj,corpse); } else { act ("$p falls onto the floor.", ch, obj, NULL, TO_ROOM); obj_to_room (obj, ch->in_room); } } } else obj_to_obj (obj, corpse); } } if (!IS_NPC (ch)) { if (ch->level <= 25) { if (!(location = get_room_index (ROOM_MORGUE))) { bug ("Morgue does not exist!", 0); } else obj_to_room (corpse, location); } else obj_to_room (corpse, ch->in_room); } else obj_to_room (corpse, ch->in_room); //gift code /* Holiday Gift Code */ /* if (IS_NPC(ch) && (dice(1,30) <= 5) && ch->level > 0) { OBJ_DATA *pill; pill = create_object(get_obj_index(41097),ch->level); obj_to_char(pill,killer); send_to_char( "{GM{Re{Gr{Rr{Gy {RC{Gh{Rr{Gist{Rm{Ga{Rs{x.\n\r", killer ); } */ if (IS_NPC(ch) && (dice(1,65) <= 5) && ch->level > 0 ) { obj = rand_obj( killer, ch->level ); obj_to_obj( obj, corpse ); } return; } /* * Improved Death_cry contributed by Diavolo. OLD void death_cry (CHAR_DATA * ch) { ROOM_INDEX_DATA *was_in_room; char *msg; int door; int vnum; vnum = 0; msg = "You hear $n's death cry."; if (IS_NPC (ch)) { if (!IS_SET (ch->act, ACT_NO_BODY)) { switch (number_bits (4)) { case 0: msg = "$n hits the ground ... DEAD."; vnum = OBJ_VNUM_BLOOD; break; case 1: msg = "$n splatters blood on your armor."; vnum = OBJ_VNUM_BLOOD; break; case 2: if (IS_SET (ch->parts, PART_GUTS)) { msg = "$n spills $s guts all over the floor."; vnum = OBJ_VNUM_GUTS; } break; case 3: if (IS_SET (ch->parts, PART_HEAD)) { msg = "$n's severed head plops on the ground."; vnum = OBJ_VNUM_SEVERED_HEAD; } break; case 4: if (IS_SET (ch->parts, PART_HEART)) { msg = "$n's heart is torn from $s chest."; vnum = OBJ_VNUM_TORN_HEART; } break; case 5: if (IS_SET (ch->parts, PART_ARMS)) { msg = "$n's arm is sliced from $s dead body."; vnum = OBJ_VNUM_SLICED_ARM; } break; case 6: if (IS_SET (ch->parts, PART_LEGS)) { msg = "$n's leg is sliced from $s dead body."; vnum = OBJ_VNUM_SLICED_LEG; } break; case 7: if (IS_SET (ch->parts, PART_BRAINS)) { msg = "$n's head is shattered, and $s brains splash all over you."; vnum = OBJ_VNUM_BRAINS; } break; case 8: if (IS_SET (ch->parts, PART_BRAINS)) { msg = "$n's head is shattered, and $s brains splash all over you."; vnum = OBJ_VNUM_BRAINS; } case 9: msg = "$n hits the ground ... DEAD."; vnum = OBJ_VNUM_BLOOD; } } } else if (ch->level > 19) { switch (number_bits (4)) { case 0: msg = "$n hits the ground ... DEAD."; vnum = OBJ_VNUM_BLOOD; break; case 1: msg = "$n splatters blood on your armor."; vnum = OBJ_VNUM_BLOOD; break; case 2: if (IS_SET (ch->parts, PART_GUTS)) { msg = "$n spills $s guts all over the floor."; vnum = OBJ_VNUM_GUTS; } break; case 3: if (IS_SET (ch->parts, PART_HEAD)) { msg = "$n's severed head plops on the ground."; vnum = OBJ_VNUM_SEVERED_HEAD; } break; case 4: if (IS_SET (ch->parts, PART_HEART)) { msg = "$n's heart is torn from $s chest."; vnum = OBJ_VNUM_TORN_HEART; } break; case 5: if (IS_SET (ch->parts, PART_ARMS)) { msg = "$n's arm is sliced from $s dead body."; vnum = OBJ_VNUM_SLICED_ARM; } break; case 6: if (IS_SET (ch->parts, PART_LEGS)) { msg = "$n's leg is sliced from $s dead body."; vnum = OBJ_VNUM_SLICED_LEG; } break; case 7: if (IS_SET (ch->parts, PART_BRAINS)) { msg = "$n's head is shattered, and $s brains splash all over you."; vnum = OBJ_VNUM_BRAINS; } break; case 8: if (IS_SET (ch->parts, PART_BRAINS)) { msg = "$n's head is shattered, and $s brains splash all over you."; vnum = OBJ_VNUM_BRAINS; } case 9: if (IS_SET (ch->parts, PART_LEGS)) { msg = "$n's leg is sliced from $s dead body."; vnum = OBJ_VNUM_SLICED_LEG; } break; case 10: if (IS_SET (ch->parts, PART_HEAD)) { msg = "$n's severed head plops on the ground."; vnum = OBJ_VNUM_SEVERED_HEAD; } break; case 11: if (IS_SET (ch->parts, PART_HEART)) { msg = "$n's heart is torn from $s chest."; vnum = OBJ_VNUM_TORN_HEART; } break; case 12: if (IS_SET (ch->parts, PART_ARMS)) { msg = "$n's arm is sliced from $s dead body."; vnum = OBJ_VNUM_SLICED_ARM; } break; case 13: if (IS_SET (ch->parts, PART_LEGS)) { msg = "$n's leg is sliced from $s dead body."; vnum = OBJ_VNUM_SLICED_LEG; } break; case 14: if (IS_SET (ch->parts, PART_BRAINS)) { msg = "$n's head is shattered, and $s brains splash all over you."; vnum = OBJ_VNUM_BRAINS; } } } // no body parts in arena if (IN_ARENA(ch)) { msg = "$n hits the ground ... DEAD."; vnum = OBJ_VNUM_BLOOD; } act (msg, ch, NULL, NULL, TO_ROOM); if ((vnum == 0) && !IS_SET (ch->act, ACT_NO_BODY)) { switch (number_bits (4)) { case 0: vnum = 0; break; case 1: vnum = OBJ_VNUM_BLOOD; break; case 2: vnum = 0; break; case 3: vnum = OBJ_VNUM_BLOOD; break; case 4: vnum = 0; break; case 5: vnum = OBJ_VNUM_BLOOD; break; case 6: vnum = 0; break; case 7: vnum = OBJ_VNUM_BLOOD; } } 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); obj->timer = number_range (4, 7); if (!IS_NPC (ch)) { obj->timer = number_range (12, 18); } if (vnum == OBJ_VNUM_BLOOD) { obj->timer = number_range (1, 4); } 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); sprintf (buf, obj->name, name); free_string (obj->name); obj->name = str_dup (buf); if (obj->item_type == ITEM_FOOD) { if (IS_SET (ch->form, FORM_POISON)) obj->value[3] = 1; else if (!IS_SET (ch->form, FORM_EDIBLE)) obj->item_type = ITEM_TRASH; } if (IS_NPC (ch)) { obj->value[4] = 0; } else { obj->value[4] = 1; } obj_to_room (obj, ch->in_room); } 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->u1.to_room != NULL && pexit->u1.to_room != was_in_room) { ch->in_room = pexit->u1.to_room; act (msg, ch, NULL, NULL, TO_ROOM); } } ch->in_room = was_in_room; return; } */ /* * New death_cry -- Skyntil. */ void death_cry (CHAR_DATA * ch) { /* ROOM_INDEX_DATA *was_in_room; */ char *msg; /* int door; */ 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->u1.to_room != NULL && pexit->u1.to_room != was_in_room) { ch->in_room = pexit->u1.to_room; act (msg, ch, NULL, NULL, TO_ROOM); } } ch->in_room = was_in_room; */ return; } void raw_kill (CHAR_DATA * victim, CHAR_DATA * killer) { int i; int arena = FALSE; CHAR_DATA *groupie, *groupie_next; char buf[100]; sprintf (log_buf, "%s got toasted by %s {Vat %s {V[room %d]", (IS_NPC (victim) ? victim->short_descr : victim->name), (IS_NPC (killer) ? killer->short_descr : killer->name), killer->in_room->name, killer->in_room->vnum); if (IS_NPC (victim)) wiznet (log_buf, NULL, NULL, WIZ_MOBDEATHS, 0, 0); else wiznet (log_buf, NULL, NULL, WIZ_DEATHS, 0, 0); /* Quickening for Highlanders */ if(killer->class == CLASS_HIGHLANDER && !IS_NPC(victim) && !IN_ARENA(killer)) { act("Lightning strikes $n and $e starts to glow with power.",killer,NULL,NULL,TO_ROOM); act("Lightning strikes you as you start feeling the quickening.",killer,NULL,NULL,TO_CHAR); /* if(killer->pcdata->power[POWER_KILLS] < 65500) killer->pcdata->power[POWER_KILLS] += 1; if(killer->pcdata->power[POWER_POINTS] < 65500) killer->pcdata->power[POWER_POINTS] += dice(20,75); */ update_power(killer); } /* else if(killer->class == CLASS_HIGHLANDER && IS_NPC(victim)) { update_power(killer); if(number_percent() < 28) { send_to_char("You skin crawls with electricity for a moment.\n\r",killer); if(killer->pcdata->power[POWER_POINTS] < 65500) killer->pcdata->power[POWER_POINTS] += dice(1,10); update_power(killer); } } */ if(victim->class == CLASS_HIGHLANDER && !IS_NPC(killer) && !IN_ARENA(victim)) { act("Lightning strikes $n and $e writhes in pain.",victim,NULL,NULL,TO_ROOM); act("Lightning strikes you and you writhe in pain.",victim,NULL,NULL,TO_CHAR); /* if(victim->pcdata->power[POWER_KILLS] >= 1) victim->pcdata->power[POWER_KILLS] -= 1; if(victim->pcdata->power[POWER_POINTS] >= 500) victim->pcdata->power[POWER_POINTS] -= dice(35,75); */ update_power(victim); } for(groupie = killer->in_room->people; groupie != NULL; groupie = groupie_next) { groupie_next = groupie->next_in_room; if(is_same_group(killer,groupie) && is_affected(groupie,gsn_decapitate)) affect_strip(groupie,gsn_decapitate); } if(is_affected(killer,gsn_decapitate)) affect_strip(killer,gsn_decapitate); if (victim->morph_form[0] == MORPH_CONCEAL) { if(is_affected(victim, gsn_conceal)) { affect_strip(victim, gsn_conceal); } /* if(victim->long_descr != NULL || !str_cmp(victim->long_descr,"A dark assassin stands here.\n\r")) { free_string(victim->long_descr); victim->long_descr = "\0"; }*/ } if(victim->morph_form[0] > 0) victim->morph_form[0] = 0; if (!IS_NPC (victim) && !IN_ARENA(victim)) { /* * Dying penalty: * 2/3 way back to previous level. */ if (victim->exp > exp_per_level (victim, victim->pcdata->points) * victim->level) gain_exp (victim, (2 * (exp_per_level (victim, victim->pcdata->points) * victim->level - victim->exp) / 3) + 50); } if (!IS_NPC(victim) && IN_ARENA(victim)) arena = TRUE; death_cry (victim); stop_fighting (victim, TRUE); make_corpse (victim, killer); if (IS_NPC (victim)) { victim->pIndexData->killed++; kill_table[URANGE (0, victim->level, MAX_LEVEL - 1)].killed++; extract_char (victim, TRUE); return; } if (!IS_NPC (killer)) { // no self-kills on record // no arena kills/deaths on record // no immortal deaths on record if ((killer != victim) && (!IS_SET(victim->in_room->room_flags,ROOM_ARENA)) && !IS_IMMORTAL(killer) && !IS_IMMORTAL(victim)) { // killer gets no kills for TWITs if (!IS_SET (victim->act, PLR_TWIT)) killer->pcdata->pkills++; victim->pcdata->pdeath++; if(IS_SET(victim->plyr, PLAYER_NEWBIE)) { victim->pcdata->prank -= (rank_pk(killer,victim)/2); } else { victim->pcdata->prank -= rank_pk(killer,victim); } killer->pcdata->prank += rank_pk(killer,victim); if (victim->pcdata->prank <= 0) victim->pcdata->prank = 1; if (IS_SET(killer->plyr, PLAYER_NEWBIE) && (killer->pcdata->prank >= 1530)) REMOVE_BIT(killer->plyr, PLAYER_NEWBIE); // Rack em up for the clans if(victim->clan != 0) clan_table[victim->clan].deaths += 1; if(killer->clan != 0) clan_table[killer->clan].kills += 1; } else if ((killer != victim) && (IS_SET(victim->in_room->room_flags,ROOM_ARENA)) && !IS_IMMORTAL(killer) && !IS_IMMORTAL(victim)) { victim->pcdata->arank -= rank_arena(killer,victim); killer->pcdata->arank += rank_arena(killer,victim); killer->pcdata->awins++; victim->pcdata->alosses++; if (victim->pcdata->arank <= 0) victim->pcdata->arank = 1; } if (!is_banklist (victim)) { int bank; bank = number_range (0, 3); if ((number_range (1, 100) < 33) && victim->balance[bank]) { char buf[MAX_STRING_LENGTH]; int amount; int pwd; OBJ_DATA *pbook; EXTRA_DESCR_DATA *ed; amount = (number_range (1, 75) / 100) * victim->balance[bank]; pwd = number_range (1, 20000); pbook = create_object (get_obj_index (OBJ_VNUM_PASSBOOK), 0); sprintf (buf, "%s %s", capitalize (victim->name), pbook->name); free_string (pbook->name); pbook->name = str_dup (buf); sprintf (buf, "The passbook is covered with strange magical symbols that prevent your eyes\n\rfrom focusing on the inscriptions. Only the word {B%s{x is legible.\n\r", capitalize (victim->name)); ed = alloc_perm (sizeof (*ed)); ed->keyword = str_dup ("passbook"); ed->description = str_dup (buf); ed->next = pbook->extra_descr; pbook->extra_descr = ed; pbook->value[0] = bank; pbook->value[1] = pwd; pbook->value[2] = amount; obj_to_char (pbook, killer); send_to_char ("{RA passbook appears in your inventory!{x\n\r", killer); change_banklist (killer, TRUE, bank, amount, pwd, victim->name); } } } extract_char (victim, FALSE); if (!arena) { while (victim->affected) affect_remove (victim, victim->affected); victim->affected_by = race_table[victim->race].aff; victim->shielded_by = race_table[victim->race].shd; for (i = 0; i < 4; i++) victim->armor[i] = 100; } if (arena) { victim->position = POS_STANDING; victim->hit = victim->max_hit; victim->mana = victim->max_mana; victim->move = victim->max_move; if(victim->affected) { if(victim->affected->type == skill_lookup("curse")) affect_remove(victim,victim->affected); else if(victim->affected->type == skill_lookup("blindness")) affect_remove(victim,victim->affected); else if(victim->affected->type == skill_lookup("plague")) affect_remove(victim,victim->affected); else if(victim->affected->type == skill_lookup("poison")) affect_remove(victim,victim->affected); else if(victim->affected->type == skill_lookup("fire breath")) affect_remove(victim,victim->affected); else if(victim->affected->type == skill_lookup("chill touch")) affect_remove(victim,victim->affected); else if(victim->affected->type == skill_lookup("slow")) affect_remove(victim,victim->affected); else if(victim->affected->type == skill_lookup("weaken")) affect_remove(victim,victim->affected); else if(victim->affected->type == skill_lookup("charm")) affect_remove(victim,victim->affected); else if(victim->affected->type == skill_lookup("shriek")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("fear")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("faerie fire")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("smokebomb")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("wither")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("feeble mind")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("nerve")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("shriek")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("garrote")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("nerve")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("fear aura")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("burning skin")) affect_remove(victim, victim->affected); else if(victim->affected->type == skill_lookup("dirt kicking")) affect_remove(victim, victim->affected); } } else { victim->position = POS_RESTING; victim->hit = UMAX (1, victim->hit); victim->mana = UMAX (1, victim->mana); victim->move = UMAX (1, victim->move); } /* Set GHOST bits */ if(!IS_NPC(killer) && !arena && killer != victim) { SET_BIT(victim->plyr,PLAYER_GHOST); victim->ghost = str_dup(killer->name); victim->ghost_timer = 90; //was 15 for 10 min real time -bree killer->ghost = str_dup(victim->name); killer->ghost_timer = 15; victim->fight_timer = 0; if(killer->clan != 0 && !IS_IMMORTAL(killer)) { sprintf(buf,"I have killed %s!",capitalize(victim->name)); do_clantalk(killer,buf); } } if(!IS_NPC(killer) && !IS_NPC(victim)) death_message(killer,victim); return; } /* * Death Messages through Announce for PK. * Can be personalized for each class. Currently for base classes. * -- Skyntil 7/30/00 */ void death_message(CHAR_DATA *killer, CHAR_DATA *victim) { /* char buf[MSL/4]; */ sh_int baseclass = 0; if(killer == victim) return; /* if(!str_cmp(killer->pcdata->target,victim->name)) { act("{Y[INFO]: $N has been {1A{!SSASINATE{1D {Yby $n!{x",killer,NULL,victim,TO_WORLD); return; } */ if(killer->class == CLASS_MAGE || killer->class == CLASS_CLERIC || killer->class == CLASS_WARRIOR || killer->class == CLASS_THIEF || killer->class == CLASS_RANGER || killer->class == CLASS_SHADE || killer->class == CLASS_DRUID) baseclass = killer->class; if(killer->class == CLASS_WIZARD || killer->class == CLASS_PRIEST || killer->class == CLASS_GLADIATOR || killer->class == CLASS_MERCENARY || killer->class == CLASS_STRIDER || killer->class == CLASS_LICH || killer->class == CLASS_SAGE) baseclass = killer->class - 7; if(killer->class == CLASS_FORSAKEN || killer->class == CLASS_CONJURER || killer->class == CLASS_ARCHMAGE) baseclass = CLASS_MAGE; if(killer->class == CLASS_VOODAN || killer->class == CLASS_SAINT) baseclass = CLASS_CLERIC; if(killer->class == CLASS_MONK) baseclass = CLASS_MONK; if(killer->class == CLASS_ASSASSIN || killer->class == CLASS_NINJA || killer->class == CLASS_BARD) baseclass = CLASS_THIEF; if(killer->class == CLASS_SWASHBUCKLER || killer->class == CLASS_CRUSADER) baseclass = CLASS_WARRIOR; if(killer->class == CLASS_HIGHLANDER) baseclass = CLASS_HIGHLANDER; if(killer->class == CLASS_DARKPALADIN || killer->class == CLASS_HUNTER || killer->class == CLASS_PALADIN) baseclass = CLASS_RANGER; if(killer->class == CLASS_ALCHEMIST || killer->class == CLASS_SHAMAN) baseclass = CLASS_DRUID; if(killer->class == CLASS_WARLOCK) baseclass = CLASS_WARLOCK; if(killer->class == CLASS_FADE || killer->class == CLASS_NECROMANCER || killer->class == CLASS_BANSHEE) baseclass = CLASS_SHADE; switch(killer->class) { case CLASS_MAGE: act("{Y[INFO]: $n {Ychannels energy into $N and causes $M to explode violently!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_WIZARD: act("{Y[INFO]: $n {Ysummons forth arcane magicks, engulfing $N in a fiery inferno!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_FORSAKEN: act("{Y[INFO]: $n {Ycommands a haunting entity to devastate $N's body and soul!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_CONJURER: act("{Y[INFO]: $n {Yconjures forth an army of beasts that turn $N into a fine mist!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_ARCHMAGE: act("{Y[INFO]: $n {Ycalls down an onslaught of elemental forces, tearing the flesh from $N's bones!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_CLERIC: act("{Y[INFO]: $n {Ycalls upon the Aesir to destroy $N's mortal body!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_PRIEST: act("{Y[INFO]: $n {Yrecites an ancient death prayer as $N is launched into eternity!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_VOODAN: act("{Y[INFO]: $n {Yutters {Ddark{Y incantations causing $N's head to shrivel and fall off $s shoulders!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_MONK: act("{Y[INFO]: $n {Ygrabs $N's body and brings $M down hard over $s knee! $N's spine breaks in half and {rblood{Y spurts onto $n!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_SAINT: act("{Y[INFO]: $n {Yraises a hand to the sky as $N is disintegrated by a bolt from the heavens!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_THIEF: act("{Y[INFO]: $n {Yinverts $s dagger and rams it through $N's skull! $N's brains splatter onto the floor!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_MERCENARY: act("{Y[INFO]: $n {Yassaults $N in physical combat, beating $M to a lifeless pulp!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_ASSASSIN: act("{Y[INFO]: $n {Yappears behind $N and {Rslits{Y their throat! Blood gushes forth from the gaping wound!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_NINJA: act("{Y[INFO]: $n {Yleaps from a cloud of {Ws{dm{Do{dk{We{Y and impales $N in the throat! A fountain of {rblood {Ysprays from $N's wound!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_BARD: act("{Y[INFO]: $n {Ysings a sweet song and lulls $N into an eternal sleep!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_WARRIOR: act("{Y[INFO]: $n {Yplunges $s weapon deep inside $N! {rBlood{Y flows from $N's mortal wounds!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_GLADIATOR: act("{Y[INFO]: $n {Ybashes into $N with a forceful blow. $N's body falls into a withered heap on the ground!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_HIGHLANDER: act("{Y[INFO]: $N's {Yhead falls onto the floor as $n brutally decapitates $M!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_SWASHBUCKLER: act("{Y[INFO]: $n {Yslides past $N's parry and severs $M's abdomen! $N's entrails leak onto the ground!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_CRUSADER: act("{Y[INFO]: $n {Ymurmers a quick prayer, then vaporizes $N with a mightly stroke!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_RANGER: act("{Y[INFO]: $n {Yspins in a circle and slices $N to pieces!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_STRIDER: act("{Y[INFO]: $n {Ydarts past $N as a pack of wolves take down $N in a fury of tooth and claw!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_DARKPALADIN: act("{Y[INFO]: $N {Yfalls to the ground as $n brutally impales them!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_HUNTER: act("{Y[INFO]: $n {Ycalls upon the {Gfo{gre{Gst{Y as vines wrap around $N and start crushing $M!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_PALADIN: act("{Y[INFO]: $n {Ypurges the lands of $N!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_DRUID: act("{Y[INFO]: $n {Ychants words of magic and $N crumples into a lifeless husk!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_SAGE: act("{Y[INFO]: $n {Ymurmurs an arcane word. $N explodes into dust!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_WARLOCK: act("{Y[INFO]:$n shoots a chain of lightning from $s fingertips turning $N's body into a smoldering pile of {Da{ds{dh{Y!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_ALCHEMIST: act("{Y[INFO]: $n {Ycreates a mystic rune that flares and incinerates $N in {Bb{blu{Be {RF{rl{Wa{rm{Re{Y!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_SHAMAN: act("{Y[INFO]: $n {Ybegins to chant as a thousand spirits surround $N and rip $M apart!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_SHADE: act("{Y[INFO]: $n {Ybites $N's neck and drinks from $M life {rblood{Y! $N becomes a lifeless, shriveled corpse!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_LICH: act("{Y[INFO]: $n {Yreaches into $N's chest and rips $M's {Rh{de{Wa{dr{Rt{Y out, purging their soul from the mortal realms!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_FADE: act("{Y[INFO]: $n {Yeyes glow {Rred{Y as $N's life energies are drained from their body!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_NECROMANCER: act("{Y[INFO]: $n {Ywaves $s hands mystically as the legions of the dead decimate $N!{x",killer,NULL,victim,TO_WORLD); break; case CLASS_BANSHEE: act("{Y[INFO]: $N's {Yhair turns {Wwhite{Y as $n shrieks at them! {RBlood{Y flows from $N's eyes as they fall lifeless!{x",killer,NULL,victim,TO_WORLD); break; default: act("{Y[INFO]: $N {Yhas been brutally murdered by $n!{x",killer,NULL,victim,TO_WORLD); break; } return; } void group_gain (CHAR_DATA * ch, CHAR_DATA * victim) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *gch; CHAR_DATA *lch; int xp; int members; int group_levels; /* * 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)) { if (ch->leader != NULL) { ch = ch->leader; } } if (IS_SET (ch->act, PLR_QUESTOR) && IS_NPC (victim)) { if (ch->questmob == victim->pIndexData->vnum) { send_to_char ("YOU have almost completed your QUEST!\n\r", ch); send_to_char ("Return to the Questmaster before your time runs out!\n\r", ch); ch->questmob = -1; } } if (victim == ch) return; /* XP for PK's .... */ /* IS_SET(ch->plyr,PLAYER_SUBDUE) && taken out for a moment */ if (!IS_NPC(victim) && !IN_ARENA(ch)) { xp = 1000; sprintf( buf, "You receive %d experience points.\n\r", xp ); send_to_char( buf, ch ); gain_exp( ch, xp ); return; } else if(!IS_NPC(victim)) return; members = 0; group_levels = 0; for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) { if (is_same_group (gch, ch)) { if(!IS_NPC(gch)) // Only count PCs members++; // if (gch != ch) // group_levels += IS_NPC (gch) ? 0 : gch->level; // else // group_levels += gch->level; group_levels = UMAX(group_levels,1); } } if (members == 0) { bug ("Group_gain: members.", members); members = 1; group_levels = ch->level; } lch = (ch->leader != NULL) ? ch->leader : ch; for (gch = ch->in_room->people; gch != NULL; gch = gch->next_in_room) { OBJ_DATA *obj; OBJ_DATA *obj_next; if ( !is_same_group ( gch, ch ) || IS_NPC ( gch ) ) continue; xp = xp_compute(gch, victim, group_levels, members); if ( ( dbl_exp_lvl ) && ( ch->level <= 100 ) ) { sprintf (buf, "{BYou receive {W%d{B experience points for being under level 101.{Y(Double EXP){x\n\r", xp*2); send_to_char (buf, gch); gain_exp (gch, xp*2); } else if ( dbl_exp || timed_dbl_exp ) { sprintf (buf, "{BYou receive {W%d{B experience points.{Y(Double EXP){x\n\r", xp*2); send_to_char (buf, gch); gain_exp (gch, xp*2); } else { sprintf (buf, "{BYou receive {W%d{B experience points.{x\n\r", xp); send_to_char (buf, gch); gain_exp (gch, xp); } if (gch->desc) { if (gch->desc->out_compress) { if (xp >= 10) { sprintf (buf, "{BYou receive {W%d{B extra experience for having MCCP!{x\n\r", xp/10); gain_exp (gch, xp/10); } send_to_char(buf,gch); } } for (obj = ch->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 (ch)) || (IS_OBJ_STAT (obj, ITEM_ANTI_GOOD) && IS_GOOD (ch)) || (IS_OBJ_STAT (obj, ITEM_ANTI_NEUTRAL) && IS_NEUTRAL (ch))) { act ("{cYou are {Wzapped{c by $p.{x", ch, obj, NULL, TO_CHAR); act ("$n is {Wzapped{x by $p.", ch, obj, NULL, TO_ROOM); obj_from_char (obj); obj_to_char(obj,ch); //obj_to_room (obj, ch->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, int total_levels, int members) { int xp, base_exp; int align, level_range; int change; /* int time_per_level; */ double mult; /* No Experience and no Alignment Change */ if (IN_ARENA(gch)) return 0; mult= ((double)(gch->level)/total_levels)*members; if (mult >= 1) { mult = (1 + mult) / 2; } else { mult = mult * mult; } mult = URANGE(.25, mult, 1.1); level_range = victim->level - gch->level; if (!IS_NPC (gch)) { if (gch->pcdata->tier > 1) level_range -= (gch->pcdata->tier*2); } /* killing players */ if (!IS_NPC (gch) && !IS_NPC (victim)) { xp = (victim->level + 25) - (gch->level); xp = xp * 20; xp = number_range (xp * 3 / 4, xp * 5 / 4); return xp; } /* compute the base exp */ switch (level_range) { default : base_exp = 0; break; case -9 : base_exp = 2; break; case -8 : base_exp = 4; break; case -7 : base_exp = 7; break; case -6 : base_exp = 12; break; case -5 : base_exp = 18; break; case -4 : base_exp = 27; break; case -3 : base_exp = 40; break; case -2 : base_exp = 53; break; case -1 : base_exp = 70; break; case 0 : base_exp = 88; break; case 1 : base_exp = 106; break; case 2 : base_exp = 128; break; case 3 : base_exp = 150; break; case 4 : base_exp = 168; break; case 5 : base_exp = 184; break; case 6 : base_exp = 198; break; case 7 : base_exp = 210; break; } if (level_range > 7) base_exp = 225 + 15 * (level_range - 4); if (mult < 1 && level_range > 7) base_exp = (2 * base_exp + 225) / 3; /* do alignment computations */ align = gch->alignment; // Alignment Changes change = align_compute(gch,victim,total_levels,members); // Change Align but Min is -1000 and Max is 1000 gch->alignment = UMAX (-1000, gch->alignment + change); gch->alignment = UMIN (1000, gch->alignment); if (gch->pet != NULL) gch->pet->alignment = gch->alignment; /* calculate exp multiplier */ if (IS_SET (victim->act, ACT_NOALIGN)) xp = base_exp; else if (gch->alignment > 500) /* for goodie two shoes */ { if (victim->alignment < -750) xp = (base_exp * 4) / 3; else if (victim->alignment < -500) xp = (base_exp * 5) / 4; else if (victim->alignment < -250) xp = (base_exp * 3) / 4; else if (victim->alignment > 250) xp = (base_exp * 3) / 4; else if (victim->alignment > 500) xp = base_exp / 2; else if (victim->alignment > 750) xp = base_exp / 4; else xp = base_exp; } else if (gch->alignment < -500) /* for baddies */ { if (victim->alignment > 750) xp = (base_exp * 4) / 3; else if (victim->alignment > 500) xp = (base_exp * 5) / 4; else if (victim->alignment > 250) xp = (base_exp * 3) / 4; else if (victim->alignment < -250) xp = (base_exp * 3) / 4; else if (victim->alignment < -500) xp = base_exp / 2; else if (victim->alignment < -750) xp = base_exp / 4; else xp = base_exp; } else if (gch->alignment > 200) /* a little good */ { if (victim->alignment < -500) xp = (base_exp * 6) / 5; else if (victim->alignment > 750) xp = base_exp / 2; else if (victim->alignment > 0) xp = (base_exp * 3) / 4; else xp = base_exp; } else if (gch->alignment < -200) /* a little bad */ { if (victim->alignment > 500) xp = (base_exp * 6) / 5; else if (victim->alignment < -750) xp = base_exp / 2; else if (victim->alignment < 0) xp = (base_exp * 3) / 4; else xp = base_exp; } else /* neutral */ { if (victim->alignment > 500 || victim->alignment < -500) xp = (base_exp * 4) / 3; else if (victim->alignment < 200 && victim->alignment > -200) xp = base_exp / 2; else xp = base_exp; } /* if (gch->level <20) xp = 20 * xp / (gch->level + 2); // more exp at the low levels if (gch->level >=20 && gch->level <= 50) xp = 15 * xp / (gch->level + 2); // less at high if (gch->level > 60 && gch->level < 90) xp = 13 * xp / (gch->level - 25); // even less at 90+ if (gch->level >= 90) xp = 8 * xp / (gch->level - 25); */ xp = 12 * xp / gch->level; /* reduce for playing time */ /* { time_per_level = 4 * (gch->played + (int) (current_time - gch->logon)) / 3600 / gch->level; time_per_level = URANGE (2, time_per_level, 12); if (gch->level < 25) time_per_level = UMAX (time_per_level, (25 - gch->level)); xp = xp * time_per_level / 12; } */ /* randomize the rewards */ xp = number_range (xp * 3 / 4, xp * 5 / 4); /*if (is_pkill(gch) || gch->level > 100) { xp *= 4; xp /= 3; } else { xp *= 4; xp /= 7; }*/ /* adjust for grouping */ if (members == 2) xp = (xp * 6)/5; if (members == 3) xp = (xp * 10)/5; if (members == 4) xp = (xp * 8)/5; if (members > 4) xp = (xp * 7)/5; if(xp > 1250 && gch->level < total_levels) xp = 1250; else if (gch->level < 101) { xp *= 1.5; if(xp > 4500) { xp = 4500; } } else if (xp > 3000) xp = 3000; return xp; } /* * Compute alignment for a kill. * Edit this function to change align computations. */ int align_compute (CHAR_DATA * gch, CHAR_DATA * victim, int total_levels, int members) { int /*align,*/ change = 0; /* Alignment is based on what is killed. There are several cases in which alignment computation must be handled differently. The degrees of align are: SUPREMELY GOOD, GOOD, SEMI-GOOD, NEUTRAL, SEMI-EVIL, EVIL, and SUPREMELY EVIL Each case must be matched up */ /* * CASE: SUPREME GOOD */ if (gch->alignment > 750) { /* * VICTIM: SUPREME GOOD */ if(victim->alignment > 750) { change = -number_range(10,victim->level); if(victim->level < (gch->level - victim->level/5)) change *= 2; if((gch->level + victim->level/5) < victim->level) change /= 2; } /* * VICTIM: GOOD */ else if(victim->alignment > 500) { change = number_range(5,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SEMI-GOOD */ else if(victim->alignment > 250) { change = number_range(3,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: NEUTRAL */ else if(victim->alignment <= 250 && victim->alignment >= -250) change = 0; /* * VICTIM: SEMI-EVIL */ else if(victim->alignment < -250) { change = number_range(3,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: EVIL */ else if(victim->alignment < -500) { change = number_range(5,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SUPREMELY EVIL */ else if(victim->alignment < -750) { change = number_range(10,victim->level); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } else change = 0; } /* * CASE: GOOD */ else if (gch->alignment > 500) { /* * VICTIM: SUPREME GOOD */ if(victim->alignment > 750) { change = -number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change *= 2; if((gch->level + victim->level/5) < victim->level) change /= 2; } /* * VICTIM: GOOD */ else if(victim->alignment > 500) { change = -number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SEMI-GOOD */ else if(victim->alignment > 250) { change = number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: NEUTRAL */ else if(victim->alignment <= 250 && victim->alignment >= -250) change = 0; /* * VICTIM: SEMI-EVIL */ else if(victim->alignment < -250) { change = number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: EVIL */ else if(victim->alignment < -500) { change = number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SUPREMELY EVIL */ else if(victim->alignment < -750) { change = number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } else change = 0; } /* * CASE: SEMI-GOOD */ else if (gch->alignment > 250) { /* * VICTIM: SUPREME GOOD */ if(victim->alignment > 750) { change = -number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change *= 2; if((gch->level + victim->level/5) < victim->level) change /= 2; } /* * VICTIM: GOOD */ else if(victim->alignment > 500) { change = -number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SEMI-GOOD */ else if(victim->alignment > 250) { change = -number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: NEUTRAL */ else if(victim->alignment <= 250 && victim->alignment >= -250) change = 0; /* * VICTIM: SEMI-EVIL */ else if(victim->alignment < -250) { change = number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: EVIL */ else if(victim->alignment < -500) { change = number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SUPREMELY EVIL */ else if(victim->alignment < -750) { change = number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } else change = 0; } /* * CASE: NEUTRAL */ if (gch->alignment <= 250 && gch->alignment >= -250) { /* * VICTIM: SUPREME GOOD */ if(victim->alignment > 750) { change = -number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change *= 2; if((gch->level + victim->level/5) < victim->level) change /= 2; } /* * VICTIM: GOOD */ else if(victim->alignment > 500) { change = -number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SEMI-GOOD */ else if(victim->alignment > 250) { change = -number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: NEUTRAL */ else if(victim->alignment <= 250 && victim->alignment >= -250) change = 0; /* * VICTIM: SEMI-EVIL */ else if(victim->alignment < -250) { change = number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: EVIL */ else if(victim->alignment < -500) { change = number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SUPREMELY EVIL */ else if(victim->alignment < -750) { change = number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } else change = 0; } /* * CASE: SEMI-EVIL */ else if (gch->alignment < -250) { /* * VICTIM: SUPREME GOOD */ if(victim->alignment > 750) { change = -number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change *= 2; if((gch->level + victim->level/5) < victim->level) change /= 2; } /* * VICTIM: GOOD */ else if(victim->alignment > 500) { change = -number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SEMI-GOOD */ else if(victim->alignment > 250) { change = -number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: NEUTRAL */ else if(victim->alignment <= 250 && victim->alignment >= -250) change = 0; /* * VICTIM: SEMI-EVIL */ else if(victim->alignment < -250) { change = -number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: EVIL */ else if(victim->alignment < -500) { change = number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SUPREMELY EVIL */ else if(victim->alignment < -750) { change = number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } else change = 0; } /* * CASE: EVIL */ else if (gch->alignment < -500) { /* * VICTIM: SUPREME GOOD */ if(victim->alignment > 750) { change = -number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change *= 2; if((gch->level + victim->level/5) < victim->level) change /= 2; } /* * VICTIM: GOOD */ else if(victim->alignment > 500) { change = -number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SEMI-GOOD */ else if(victim->alignment > 250) { change = -number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: NEUTRAL */ else if(victim->alignment <= 250 && victim->alignment >= -250) change = 0; /* * VICTIM: SEMI-EVIL */ else if(victim->alignment < -250) { change = -number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: EVIL */ else if(victim->alignment < -500) { change = -number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SUPREMELY EVIL */ else if(victim->alignment < -750) { change = number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } else change = 0; } /* * CASE: SUPREMELY EVIL */ else if (gch->alignment < -750) { /* * VICTIM: SUPREME GOOD */ if(victim->alignment > 750) { change = -number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change *= 2; if((gch->level + victim->level/5) < victim->level) change /= 2; } /* * VICTIM: GOOD */ else if(victim->alignment > 500) { change = -number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SEMI-GOOD */ else if(victim->alignment > 250) { change = -number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: NEUTRAL */ else if(victim->alignment <= 250 && victim->alignment >= -250) change = 0; /* * VICTIM: SEMI-EVIL */ else if(victim->alignment < -250) { change = -number_range(15,victim->level/4); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: EVIL */ else if(victim->alignment < -500) { change = -number_range(25,victim->level/2); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } /* * VICTIM: SUPREMELY EVIL */ else if(victim->alignment < -750) { change = number_range(40,victim->level); if(victim->level < (gch->level - victim->level/5)) change /= 2; if((gch->level + victim->level/5) < victim->level) change *= 2; } else change = 0; } change = change * gch->level / total_levels; if(members > 3) change /= members; /* Hold Align */ if(is_affected(gch,gsn_hold_align)) change = 0; return URANGE( -100, change, 100 ); } void dam_message (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt, bool immune) { dam_message_new(ch,victim,dam,dt,immune,DMF_NONE); } void dam_message_new(CHAR_DATA * ch, CHAR_DATA * victim, int dam, int dt, bool immune, int dam_flags) { char buf1[256], buf2[256], buf3[256]; const char *vs; const char *vp; const char *attack; int max_damage, damp, dam_type = DAM_NONE; char punct; char *msg; if (ch == NULL || victim == NULL) return; if (IS_NPC(victim)) max_damage = 0; else max_damage = -10; if ( (victim->hit - dam > max_damage ) || (dt >= 0 && dt < MAX_SKILL) || IS_NPC(victim) || IS_SET(victim->act,ACT_NO_BODY) ) { if (dam == 0) { vs = "miss"; vp = "{&misses"; } else if (dam <= 4) { vs = "{1scratch"; vp = "{1scratches"; } else if (dam <= 6) { vs = "{2blemish"; vp = "{2blemishes"; } else if (dam <= 8) { vs = "{3scathe"; vp = "{3scathes"; } else if (dam <= 10) { vs = "{6hurt"; vp = "{6hurts"; } else if (dam <= 14) { vs = "{7graze"; vp = "{7grazes"; } else if (dam <= 18) { vs = "{8hit"; vp = "{8hits"; } else if (dam <= 22) { vs = "{1injure"; vp = "{1injures"; } else if (dam <= 26) { vs = "{2harm"; vp = "{2harms"; } else if (dam <= 30) { vs = "{3maim"; vp = "{3maims"; } else if (dam <= 34) { vs = "{!B{@A{!T{@T{!E{@R"; vp = "{!B{@A{!T{@T{!E{@R{!S"; } else if (dam <= 40) { vs = "{@C{#O{@N{#T{@O{#R{@T{"; vp = "{@C{#O{@N{#T{@O{#R{@T{#S"; } else if (dam <= 44) { vs = "{#M{^A{#N{^G{#L{^E"; vp = "{#M{^A{#N{^G{#L{^E{#S"; } else if (dam <= 48) { vs = "{$M{%A{$R"; vp = "{$M{%AR{$S"; } else if (dam <= 52) { vs = "{%G{^AS{%H"; vp = "{%G{^A{%S{^H{%E{^S"; } else if (dam <= 56) { vs = "{^I{&M{^P{&A{^I{&R"; vp = "{^I{&M{^P{&A{^I{&R{^S"; } else if (dam <= 60) { vs = "{&M{!U{&T{!I{&L{!A{&T{!E"; vp = "{&M{!U{&T{!I{&L{!A{&T{!E{&S"; } else if (dam <= 64) { vs = "{!D{#I{!S{#E{!M{#B{!O{#W{!E{#L"; vp = "{!D{#I{!S{#E{!M{#B{!O{#W{!E{#L{!S"; } else if (dam <= 70) { vs = "{@D{&I{@S{&M{@E{&M{@B{&E{@R"; vp = "{@D{&I{@S{&M{@E{&M{@B{&E{@R{&S"; } else if (dam <= 75) { vs = "{1={!={&= {1T{!HR{&A{!SH{1E {&={!={1="; vp = "{1={!={&= {1T{!HR{&AS{!HE{1S {&={!={1="; } else if (dam <= 80) { vs = "{2+{@+{&+ {2M{@AS{&SA{@CR{2E {&+{@+{2+"; vp = "{2+{@+{&+ {2M{@AS{&SAC{@RE{2S {&+{@+{2+"; } else if (dam <= 85) { vs = "{3<{#<{&< {3DE{#MO{&L{#IS{3H {&>{#>{3>"; vp = "{3<{#<{&< {3DE{#MO{&LI{#SH{3ES {&>{#>{3>"; } else if (dam <= 100) { vs = "{6={^+{&= {6DI{^SF{&I{^GU{6RE {&={^+{6="; vp = "{6={^+{&= {6DI{^SF{&IG{^UR{6ES {&={^+{6="; } else if (dam <= 125) { vs = "{8>{7>{&> {8OB{7LI{&TE{7RA{8TE {&<{7<{8<"; vp = "{8>{7>{&> {8OB{7LI{&TER{7AT{8ES {&<{7<{8<"; } else if (dam <= 150) { vs = "{&<{^<{6< {&R{^UP{6T{^UR{&E {6>{^>{&>"; vp = "{&<{^<{6< {&R{^UP{6TU{^RE{&S {6>{^>{&>"; } else if (dam <= 200) { vs = "{&-{7={#-={3- {&A{7N{#NI{3HI{#LA{7T{&E {3-{#=-{7={&-"; vp = "{&-{7={#-={3- {&A{7N{#NI{3HIL{#AT{7E{&S {3-{#=-{7={&-"; } else if (dam <= 250) { vs = "{&+{7={2+={@+ {&B{@U{2TCH{@E{&R {2+{@=+{7={&+"; vp = "{&+{7={2+={@+ {&B{@UT{2CH{@ER{&S {2+{@=+{7={&+"; } else if (dam <= 300) { vs = "{&^{7*^{8*^ {&ER{7AD{8IC{7AT{&E {8^*{7^*{&^"; vp = "{&^{7*^{8*^ {&ER{7AD{8IC{7AT{&ES {8^*{7^*{&^"; } else if (dam <= 350) { vs = "{1*{!*{&*{!*{1* {1C{!RU{&CI{!FI{1E {1*{!*{&*{!*{1*"; vp = "{1*{!*{&*{!*{1* {1C{!RU{&CIF{!IE{1S {1*{!*{&*{!*{1*"; } else if (dam <= 400) { vs = "{2+{@+{&+{@+{2+ {2L{@IQ{&UI{@FI{2E {2+{@+{&+{@+{2+"; vp = "{2+{@+{&+{@+{2+ {2L{@IQ{&UIF{@IE{2S {2+{@+{&+{@+{2+"; } else if (dam == 420) { vs = "do {G_{g\\{G|{g/{G_CA{gNN{dA{gBA{dC{gIO{GUS_{g\\{G|{g/{G_{x things to"; vp = "does {G_{g\\{G|{g/{G_CA{gNN{dA{gBA{dC{gIO{GUS_{g\\{G|{g/{G_{x things to"; } else if (dam <= 500) { vs = "{3={#-{&={#-{3= {3DE{#CA{&PI{#TA{3TE {3={#-{&={#-{3="; vp = "{3={#-{&={#-{3= {3DE{#CA{&PIT{#AT{3ES {3={#-{&={#-{3="; } else if (dam <= 600) { vs = "{5*{%-{&*{%-{5* {5V{%AP{&OUR{%IZ{5E {5*{%-{&*{%-{5*"; vp = "{5*{%-{&*{%-{5* {5VA{%PO{&UR{%IZ{5ES {5*{%-{&*{%-{5*"; } else if (dam == 666) { vs = "do {R^{D*{r<{RD{rE{dMON{rI{RC{r>{D*{R^{x things to"; vp = "does {R^{D*{r<{RD{rE{dMON{rI{RC{r>{D*{R^{x things to"; } else if (dam == 777) { vs = "deal {R*{Y,{R*{Y,{R*{Y,{RL{rUCK{RY SE{YVE{RNS{Y,{R*{Y,{R*{Y,{R*{x to"; vp = "deals {R*{Y,{R*{Y,{R*{Y,{RL{rUCK{RY SE{YVE{RNS{Y,{R*{Y,{R*{Y,{R*{x to"; } else if (dam <= 900) { vs = "{6-{^-{&-{^-{6- {6P{^UL{&VER{^IZ{6E {6-{^-{&-{^-{6-"; vp = "{6-{^-{&-{^-{6- {6PU{^LV{&ER{^IZ{6ES {6-{^-{&-{^-{6-"; } else if (dam <= 1200) { vs = "{4^{$+{&^{$+{4^ {4S{$E{&V{$E{4R {4^{$+{&^{$+{4^"; vp = "{4^{$+{&^{$+{4^ {4S{$E{&VE{$R{4S {4^{$+{&^{$+{4^"; } else if (dam <= 1800) { vs = "{8={7={&={7={8= {8S{7M{&I{7T{8E {8={7={&={7={8="; vp = "{8={7={&={7={8= {8S{7M{&IT{7E{8S {8={7={&={7={8="; } else { vs = "do {%U{@N{#S{^P{!E{&A{!K{^A{#B{@L{%E things to"; vp = "{%does {%U{@N{#S{^P{!E{&A{!K{^A{#B{@L{%E things to"; } punct = (dam <= 24) ? '.' : '!'; if (dt == TYPE_HIT) { if (ch == victim) { sprintf (buf1, "{($n %s{( $melf%c{x [%d]", vp, punct, dam); sprintf (buf2, "{.You %s{. yourself%c{x [%d]", vs, punct, dam); } else { sprintf (buf1, "{($n %s{( $N%c{x [%d]", vp, punct, dam); sprintf (buf2, "{.You %s{. $N%c{x [%d]", vs, punct, dam); sprintf (buf3, "{)$n %s{) you%c{x [%d]", vp, punct, dam); } } else { if (dt >= 0 && dt < MAX_SKILL) attack = skill_table[dt].noun_damage; else if (dt >= TYPE_HIT && dt < TYPE_HIT + MAX_DAMAGE_MESSAGE) attack = attack_table[dt - TYPE_HIT].noun; else { bug ("Dam_message: bad dt %d.", dt); dt = TYPE_HIT; attack = attack_table[0].name; } if (immune) { if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) { if (ch == victim) { sprintf (buf1, "{($n is unaffected by $s own %s{k.{x", attack); sprintf (buf2, "{.Luckily, you are immune to that.{x"); } else { sprintf (buf1, "{($N is unaffected by $n's %s{k!{x", attack); sprintf (buf2, "{.$N is unaffected by your %s{h!{x", attack); sprintf (buf3, "{)$n's %s{i is powerless against you.{x", attack); } } } else { if (ch == victim) { sprintf (buf1, "{($n's %s{( %s{( $N%c{x {3[%d{3]{x", attack, vp, punct, dam); sprintf (buf1, "{($n's %s{( %s{( $m%c{x {3[%d{3]{x", attack, vp, punct, dam); sprintf (buf2, "{.Your %s{. %s{. you%c{x {3[%d{3]{x", attack, vp, punct, dam); } else { sprintf (buf1, "{($n's %s{( %s{( $N%c{x {3[%d{3]{x", attack, vp, punct, dam); sprintf (buf2, "{.Your %s{. %s{. $N%c{x {3[%d{3]{x", attack, vp, punct, dam); sprintf (buf3, "{)$n's %s{) %s{) you%c{x {3[%d{3]{x", attack, vp, punct, dam); } } } if (ch == victim) { act (buf1, ch, NULL, NULL, TO_ROOM); act (buf2, ch, NULL, NULL, TO_CHAR); } else { /* TRYING NONSHORT to = ch->in_room->people; for( ; to ; to = to->next_in_room ) { if ( (!IS_NPC(to) && to->desc == NULL ) || ( IS_NPC(to) && !HAS_TRIGGER(to, TRIG_ACT) ) ) continue; if( to == ch || to == victim ) continue; } */ act (buf1, ch, NULL, victim, TO_NONSHORT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act (buf2, ch, NULL, victim, TO_CHAR); if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act (buf3, ch, NULL, victim, TO_VICT); } } // End first IF if((victim->hit - dam < max_damage) && !IS_SET(victim->act, ACT_NO_BODY)) { // Now.....the fun Death Messages -- Skyntil if (dt >= 0 && dt < MAX_SKILL) attack = skill_table[dt].noun_damage; else if (dt >= TYPE_HIT && dt < TYPE_HIT + MAX_DAMAGE_MESSAGE) { attack = attack_table[dt - TYPE_HIT].noun; dam_type = attack_table[dt - TYPE_HIT].damage; } else { bug ("Dam_message: bad dt %d.", dt); dt = TYPE_HIT; attack = attack_table[0].name; } /* Individual 'noun' cases first, then the general dam_types * -- Skyntil 4/22/00 */ if(dam_flags & DMF_DECAP) { act("You swing your blade in a low arc, slicing off $N's head.", ch, NULL, victim, TO_CHAR); act("$n swings $s blade in a low arc, slicing off $N's head.", ch, NULL, victim, TO_NOTVICT); act("$n swings $s blade in a wide arc, slicing off your head.", ch, NULL, victim, TO_VICT); part_create(victim,"head"); } if (attack == "claw") { damp=number_range(1,3); 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); part_create(victim,"blood"); } if ( damp == 2 ) { 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); part_create(victim,"eye"); } if( damp == 3) { 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); part_create(victim,"heart"); } } else if ( dt == gsn_whip || dam_flags & DMF_WHIP ) { act("You entangle $N around the neck, and squeeze the life out of $S.", ch, NULL, victim, TO_CHAR); act("$n entangle $N around the neck, and squeezes the life out of $S.", ch, NULL, victim, TO_NOTVICT); act("$n entangles you around the neck, and squeezes the life out of you.", ch, NULL, victim, TO_VICT); } else if( dam_type == DAM_SLASH ) { damp = number_range(1,9); if ( damp == 1 ) { act("You swing your blade in a low arc, rupturing $N's abdominal cavity.\n\r$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$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); part_create(victim,"guts"); } 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); } else if ( damp == 3 ) { 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); part_create(victim,"blood"); } else if ( damp == 4 ) { 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); part_create(victim,"blood"); } else if ( damp == 5 ) { 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); part_create(victim,"brain"); } 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); } else if ( damp == 7 ) { 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); part_create(victim,"arm"); } else if ( damp == 8 ) { 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); part_create(victim,"leg"); } else if ( damp == 9) { 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); } } else if (attack == "bite") // This must go before Pierce { 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); part_create(victim,"blood"); } else if ( dam_type == DAM_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); part_create(victim,"blood"); } 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); } 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); } 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); } 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); } } else if ( dam_type == DAM_BASH && dt != gsn_hand_to_hand) { damp = number_range(1,4); 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); } 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); } else if ( damp == 3) { 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); part_create(victim,"brain"); } else if (damp == 4) { 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); } } else if ( dam_type == DAM_BASH && dt == gsn_hand_to_hand) { damp = number_range(1,2); 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); } 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); } } else if ( attack == "suction" || dam_type == DAM_NEGATIVE ) { 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 sucks out your brains.", ch, NULL, victim, TO_VICT); } else { // bug( "Dam_message: bad dt %d.", dt ); } // Death message msg = "$N hits the ground ... DEAD."; act(msg,ch,NULL,victim,TO_NOTVICT); } return; } /* * Disarm a creature. * Caller must check for successful attack. */ void disarm (CHAR_DATA * ch, CHAR_DATA * victim) { OBJ_DATA *obj; if ((obj = get_eq_char (victim, WEAR_WIELD)) == NULL) return; if (IS_OBJ_STAT (obj, ITEM_NOREMOVE)) { act ("{?$S weapon won't budge!{x", ch, NULL, victim, TO_CHAR); act ("{?$n tries to disarm you, but your weapon won't budge!{x", ch, NULL, victim, TO_VICT); act ("{3$n tries to disarm $N, but fails.{x", ch, NULL, victim, TO_NOTVICT); return; } act ("{?$n DISARMS you and sends your weapon flying!{x", ch, NULL, victim, TO_VICT); act ("{?You disarm $N{j!{x", ch, NULL, victim, TO_CHAR); act ("{($n {(disarms $N{(!{x", ch, NULL, victim, TO_NOTVICT); obj_from_char (obj); obj_to_char(obj, victim); /* if (IS_OBJ_STAT (obj, ITEM_NODROP) || IS_OBJ_STAT (obj, ITEM_INVENTORY)) obj_to_char (obj, victim); else { obj_to_room (obj, victim->in_room); if (IS_NPC (victim) && victim->wait == 0 && can_see_obj (victim, obj)) get_obj (victim, obj, NULL); } */ return; } void do_berserk (CHAR_DATA * ch, char *argument) { int chance, hp_percent; if ((chance = get_skill (ch, gsn_berserk)) == 0 || (IS_NPC (ch) && !IS_SET (ch->off_flags, OFF_BERSERK)) || (!IS_NPC (ch) && ch->level < skill_table[gsn_berserk].skill_level[ch->class])) { send_to_char ("{.You turn {rred{h in the face, but nothing happens.{x\n\r", ch); return; } if (IS_AFFECTED (ch, AFF_BERSERK) || is_affected (ch, gsn_berserk) || is_affected (ch, skill_lookup ("frenzy"))) { send_to_char ("{.You get a little madder.{x\n\r", ch); return; } if (IS_AFFECTED (ch, AFF_CALM)) { send_to_char ("{.You're feeling to mellow to berserk.{x\n\r", ch); return; } if (ch->mana < 50) { send_to_char ("{.You can't get up enough energy.{x\n\r", ch); return; } /* modifiers */ /* fighting */ if (ch->position == POS_FIGHTING) chance += 10; /* damage -- below 50% of hp helps, above hurts */ hp_percent = 100 * ch->hit / ch->max_hit; chance += 25 - hp_percent / 2; if (number_percent () < chance) { AFFECT_DATA af; WAIT_STATE (ch, PULSE_VIOLENCE); ch->mana -= 50; ch->move = UMAX(1,ch->move - 50); /* heal a little damage */ ch->hit += ch->level * 2; ch->hit = UMIN (ch->hit, ch->max_hit); send_to_char ("{.Your pulse races as you are consumed by {rrage!{x\n\r", ch); act ("{($n gets a {cw{gi{rl{yd{k look in $s eyes.{x", ch, NULL, NULL, TO_ROOM); check_improve (ch, gsn_berserk, TRUE, 2); af.where = TO_AFFECTS; af.type = gsn_berserk; af.level = ch->level; af.duration = ch->level/4; af.modifier = UMAX (1, ch->level / 4); af.bitvector = AFF_BERSERK; af.location = APPLY_HITROLL; affect_to_char (ch, &af); af.location = APPLY_DAMROLL; affect_to_char (ch, &af); af.modifier = UMAX (10, 10 * (ch->level / 20)); af.location = APPLY_AC; affect_to_char (ch, &af); } else { WAIT_STATE (ch, 2 * PULSE_VIOLENCE); ch->mana -= 25; ch->move = UMAX(1,ch->move-75); send_to_char ("{.Your pulse speeds up, but nothing happens.{x\n\r", ch); check_improve (ch, gsn_berserk, FALSE, 2); } } void do_voodoo (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *doll; if (IS_NPC (ch)) return; doll = get_eq_char (ch, WEAR_HOLD); if (doll == NULL || (doll->pIndexData->vnum != OBJ_VNUM_VOODOO)) { send_to_char ("You are not holding a voodoo doll.\n\r", ch); return; } one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Syntax: voodoo <action>\n\r", ch); send_to_char ("Actions: pin trip throw\n\r", ch); return; } if (!str_cmp (arg, "pin")) { do_vdpi (ch, doll->name); return; } if (!str_cmp (arg, "trip")) { do_vdtr (ch, doll->name); return; } if (!str_cmp (arg, "throw")) { do_vdth (ch, doll->name); return; } do_voodoo (ch, ""); } void do_vdpi (CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; DESCRIPTOR_DATA *d; AFFECT_DATA af; bool found = FALSE; argument = one_argument (argument, arg1); for (d = descriptor_list; d != NULL; d = d->next) { CHAR_DATA *wch; if (d->connected != CON_PLAYING || !can_see (ch, d->character)) continue; wch = (d->original != NULL) ? d->original : d->character; if (!can_see (ch, wch)) continue; if (!str_cmp (arg1, wch->name) && !found) { if (IS_NPC (wch)) continue; if (IS_IMMORTAL (wch) && (wch->level > ch->level)) { send_to_char ("That's not a good idea.\n\r", ch); return; } if ((wch->level < 20) && !IS_IMMORTAL (ch)) { send_to_char ("They are a little too young for that.\n\r", ch); return; } if (IS_SHIELDED (wch, SHD_PROTECT_VOODOO)) { send_to_char ("They are still reeling from a previous voodoo.\n\r", ch); return; } found = TRUE; send_to_char ("You stick a pin into your voodoo doll.\n\r", ch); act ("$n sticks a pin into a voodoo doll.", ch, NULL, NULL, TO_ROOM); send_to_char ("{RYou double over with a sudden pain in your gut!{x\n\r", wch); act ("$n suddenly doubles over with a look of extreme pain!", wch, NULL, NULL, TO_ROOM); af.where = TO_SHIELDS; af.type = skill_lookup ("protection voodoo"); af.level = wch->level; af.duration = 1; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = SHD_PROTECT_VOODOO; affect_to_char (wch, &af); return; } } send_to_char ("Your victim doesn't seem to be in the realm.\n\r", ch); return; } void do_vdtr (CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; DESCRIPTOR_DATA *d; AFFECT_DATA af; bool found = FALSE; argument = one_argument (argument, arg1); for (d = descriptor_list; d != NULL; d = d->next) { CHAR_DATA *wch; if (d->connected != CON_PLAYING || !can_see (ch, d->character)) continue; wch = (d->original != NULL) ? d->original : d->character; if (!can_see (ch, wch)) continue; if (!str_cmp (arg1, wch->name) && !found) { if (IS_NPC (wch)) continue; if (IS_IMMORTAL (wch) && (wch->level > ch->level)) { send_to_char ("That's not a good idea.\n\r", ch); return; } if ((wch->level < 20) && !IS_IMMORTAL (ch)) { send_to_char ("They are a little too young for that.\n\r", ch); return; } if (IS_SHIELDED (wch, SHD_PROTECT_VOODOO)) { send_to_char ("They are still reeling from a previous voodoo.\n\r", ch); return; } found = TRUE; send_to_char ("You slam your voodoo doll against the ground.\n\r", ch); act ("$n slams a voodoo doll against the ground.", ch, NULL, NULL, TO_ROOM); send_to_char ("{RYour feet slide out from under you!{x\n\r", wch); send_to_char ("{RYou hit the ground face first!{x\n\r", wch); act ("$n trips over $s own feet, and does a nose dive into the ground!", wch, NULL, NULL, TO_ROOM); af.where = TO_SHIELDS; af.type = skill_lookup ("protection voodoo"); af.level = wch->level; af.duration = 1; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = SHD_PROTECT_VOODOO; affect_to_char (wch, &af); return; } } send_to_char ("Your victim doesn't seem to be in the realm.\n\r", ch); return; } void do_vdth (CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; DESCRIPTOR_DATA *d; AFFECT_DATA af; ROOM_INDEX_DATA *was_in; ROOM_INDEX_DATA *now_in; bool found = FALSE; int attempt; argument = one_argument (argument, arg1); for (d = descriptor_list; d != NULL; d = d->next) { CHAR_DATA *wch; if (d->connected != CON_PLAYING || !can_see (ch, d->character)) continue; wch = (d->original != NULL) ? d->original : d->character; if (!can_see (ch, wch)) continue; if (!str_cmp (arg1, wch->name) && !found) { if (IS_NPC (wch)) continue; if (IS_IMMORTAL (wch) && (wch->level > ch->level)) { send_to_char ("That's not a good idea.\n\r", ch); return; } if ((wch->level < 20) && !IS_IMMORTAL (ch)) { send_to_char ("They are a little too young for that.\n\r", ch); return; } if (IS_SHIELDED (wch, SHD_PROTECT_VOODOO)) { send_to_char ("They are still reeling from a previous voodoo.\n\r", ch); return; } found = TRUE; send_to_char ("You toss your voodoo doll into the air.\n\r", ch); act ("$n tosses a voodoo doll into the air.", ch, NULL, NULL, TO_ROOM); af.where = TO_SHIELDS; af.type = skill_lookup ("protection voodoo"); af.level = wch->level; af.duration = 1; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = SHD_PROTECT_VOODOO; affect_to_char (wch, &af); if ((wch->fighting != NULL) || (number_percent () < 25)) { send_to_char ("{RA sudden gust of wind throws you through the air!{x\n\r", wch); send_to_char ("{RYou slam face first into the nearest wall!{x\n\r", wch); act ("A sudden gust of wind picks up $n and throws $m into a wall!", wch, NULL, NULL, TO_ROOM); return; } wch->position = POS_STANDING; was_in = wch->in_room; for (attempt = 0; attempt < 6; attempt++) { EXIT_DATA *pexit; int door; door = number_door (); if ((pexit = was_in->exit[door]) == 0 || pexit->u1.to_room == NULL || IS_SET (pexit->exit_info, EX_CLOSED) || (IS_NPC (wch) && IS_SET (pexit->u1.to_room->room_flags, ROOM_NO_MOB))) continue; move_char (wch, door, FALSE, TRUE); if ((now_in = wch->in_room) == was_in) continue; wch->in_room = was_in; sprintf (buf, "A sudden gust of wind picks up $n and throws $m to the %s.", dir_name[door]); act (buf, wch, NULL, NULL, TO_ROOM); send_to_char ("{RA sudden gust of wind throws you through the air!{x\n\r", wch); wch->in_room = now_in; act ("$n sails into the room and slams face first into a wall!", wch, NULL, NULL, TO_ROOM); do_look (wch, "auto"); send_to_char ("{RYou slam face first into the nearest wall!{x\n\r", wch); return; } send_to_char ("{RA sudden gust of wind throws you through the air!{x\n\r", wch); send_to_char ("{RYou slam face first into the nearest wall!{x\n\r", wch); act ("A sudden gust of wind picks up $n and throws $m into a wall!", wch, NULL, NULL, TO_ROOM); return; } } send_to_char ("Your victim doesn't seem to be in the realm.\n\r", ch); return; } void do_bash (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int chance; //COOLDOWN_DATA cd; one_argument (argument, arg); if ((chance = get_skill (ch, gsn_bash)) == 0 || (IS_NPC (ch) && !IS_SET (ch->off_flags, OFF_BASH)) || (!IS_NPC (ch) && ch->level < skill_table[gsn_bash].skill_level[ch->class])) { send_to_char ("Bashing? What's that?\n\r", ch); return; } if (arg[0] == '\0') { victim = ch->fighting; if (victim == NULL) { send_to_char ("But you aren't fighting anyone!\n\r", ch); return; } } else if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (victim->position < POS_FIGHTING) { act ("You'll have to let $M get back up first.", ch, NULL, victim, TO_CHAR); return; } if (victim == ch) { send_to_char ("You try to bash your brains out, but fail.\n\r", ch); return; } if (is_safe (ch, victim)) return; if (IS_AFFECTED (ch, AFF_CHARM) && ch->master == victim) { act ("But $N is your friend!", ch, NULL, victim, TO_CHAR); return; } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 25)) { act("You get a running start, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n gets a running start, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if (ch->stunned > 0) { send_to_char ("You're still a little woozy.\n\r", ch); return; } if (!can_see (ch, victim)) { send_to_char ("You get a running start, and slam right into a wall.\n\r", ch); return; } if ((ch->fighting == NULL) && (!IS_NPC (ch)) && (!IS_NPC (victim))) { ch->attacker = TRUE; victim->attacker = FALSE; } /* Cooldown check if (ch->fighting != NULL && on_cooldown(ch, gsn_bash)) { send_to_char ("Bash is still on cooldown.\n\r", ch); return; } *Apply cooldown cd.type = skill_lookup("bash"); cd.duration = skill_table[gsn_bash].cooldown; cooldown_on( ch, &cd );*/ /* modifiers */ /* size and weight */ chance += ch->carry_weight / 250; chance -= victim->carry_weight / 200; if (ch->size < victim->size) chance += (ch->size - victim->size) * 10; else chance += (ch->size - victim->size) * 10; /* stats */ chance += get_curr_stat (ch, STAT_STR); chance -= (get_curr_stat (victim, STAT_DEX) * 2); chance -= GET_AC (victim, AC_BASH) / 5; /* speed */ if (IS_SET (ch->off_flags, OFF_FAST) || IS_AFFECTED (ch, AFF_HASTE)) chance += 10; if (IS_SET (victim->off_flags, OFF_FAST) || IS_AFFECTED (victim, AFF_HASTE)) chance -= 30; /* level */ if (!IS_NPC (victim)) chance += (ch->level - victim->level); else chance += (ch->level - victim->level)/5; if (!IS_NPC (victim) && chance < get_skill (victim, gsn_dodge)) { chance -= 3 * (get_skill (victim, gsn_dodge) - chance); } if (check_tumble(ch,victim,gsn_bash)) { check_improve(ch,gsn_bash,TRUE,2); act("$N rolls free of $n's bash.",ch,0,victim,TO_NOTVICT); act("You roll out of $n's bash attempt.",ch,0,victim,TO_VICT); act("$N rolls free of your bash attempt.",ch,0,victim,TO_CHAR); WAIT_STATE(ch,skill_table[gsn_bash].beats); return; } if(victim->class == CLASS_FADE) { if(number_percent() < 35) { if(check_phase_real(ch,victim,TRUE)) { act("{)$n tries to bash you, but you phase out of the attack.{x",ch,NULL,victim,TO_VICT); act("{.$N phases out, and you bash at thin air!{x",ch,NULL,victim,TO_CHAR); WAIT_STATE(ch,skill_table[gsn_bash].beats); return; } } } /* now the attack */ if (number_percent () < chance) { act ("{)$n sends you sprawling with a powerful bash!{x", ch, NULL, victim, TO_VICT); act ("{.You slam into $N, and send $M flying!{x", ch, NULL, victim, TO_CHAR); act ("{($n sends $N sprawling with a powerful bash.{x", ch, NULL, victim, TO_NOTVICT); check_improve (ch, gsn_bash, TRUE, 1); DAZE_STATE (victim, PULSE_VIOLENCE); WAIT_STATE (ch, skill_table[gsn_bash].beats); damage (ch, victim, number_range (2, 2 + 2 * ch->size + chance / 20), gsn_bash,DAM_BASH, FALSE, 0); victim->position = POS_RESTING; chance = (get_skill (ch, gsn_stun) / 5); if (number_percent () < chance) { victim->stunned = 2; act ("{)You are stunned, and have trouble getting back up!{x", ch, NULL, victim, TO_VICT); act ("{.$N is stunned by your bash!{x", ch, NULL, victim, TO_CHAR); act ("{($N is having trouble getting back up.{x", ch, NULL, victim, TO_NOTVICT); check_improve (ch, gsn_stun, TRUE, 1); } } else { damage (ch, victim, 0, gsn_bash, DAM_BASH, FALSE, 0); act ("{.You fall flat on your face!{x", ch, NULL, victim, TO_CHAR); act ("{($n falls flat on $s face.{x", ch, NULL, victim, TO_NOTVICT); act ("{)You evade $n's bash, causing $m to fall flat on $s face.{x", ch, NULL, victim, TO_VICT); check_improve (ch, gsn_bash, FALSE, 1); ch->position = POS_RESTING; WAIT_STATE (ch, skill_table[gsn_bash].beats * 3 / 2); } } void do_fear (CHAR_DATA * ch, CHAR_DATA * victim) { int chance; if ((chance = get_skill (ch, gsn_fear)) < 1 || IS_NPC(ch) || (!IS_NPC(ch) && !has_skill(ch,gsn_fear))) { return; } if (IS_AFFECTED (victim, AFF_FEAR)) { return; } if (IS_AFFECTED (victim, skill_lookup("courage"))) { return; } if (is_safe(ch,victim)) return; /* if (IS_AFFECTED(ch,AFF_CHARM) && ch->master == victim) { act("But $N is such a good friend!",ch,NULL,victim,TO_CHAR); return; } */ if (ch->stunned) { send_to_char("You're still a bit woozy.\n\r",ch); return; } if (number_percent() < 95) return; /* modifiers */ /* first a lowering of chance from best of 100 */ //chance = chance * 4/5; /* size */ chance += (ch->size-victim->size) * 10; /* stats */ chance -= get_curr_stat(victim,STAT_WIS)*2; chance += get_curr_stat(ch,STAT_WIS)+get_curr_stat(ch,STAT_CON); /* berserk! */ if(IS_AFFECTED(ch,AFF_BERSERK)) chance += 10; if(IS_AFFECTED(victim,AFF_BERSERK)) chance -= 15; /* level */ chance += (ch->level - victim->level)*2; if (chance % 5 == 0) chance += 1; if (chance < 0) { send_to_char ("{RYou cry in terror realizing how little you really are.{x\n\r",ch); victim = ch; } if (number_percent() < chance) { AFFECT_DATA af; //act("You turn your gaze on $q glaring in strength.{x",ch,NULL,victim,TO_CHAR); act("$n begins to shake, quaking in fear.{x",victim,NULL,NULL,TO_ROOM); act("$n turns his powerful gaze on you and you begin to shake in fear.{x",ch,NULL,victim,TO_VICT); check_improve(ch,gsn_fear, TRUE,2); af.where = TO_AFFECTS; af.type = gsn_fear; af.level = ch->level; af.duration = number_range(1,3); af.location = APPLY_WIS; af.modifier = -1*abs(get_curr_stat(ch,STAT_WIS)-get_curr_stat(victim,STAT_WIS))/2; af.bitvector = AFF_FEAR; affect_to_char (victim, &af); } else { //act("You turn your gaze on $q attempting to glare.{x",ch,NULL,victim,TO_CHAR); act("$n frowns and shakes $s head.{x",victim,NULL,NULL,TO_ROOM); act("$n turns his gaze on you and you glare back.{x",ch,NULL,victim,TO_VICT); check_improve(ch,gsn_fear,TRUE,2); } return; } void do_dirt (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int chance; //COOLDOWN_DATA cd; one_argument (argument, arg); if ((chance = get_skill (ch, gsn_dirt)) == 0 || (IS_NPC (ch) && !IS_SET (ch->off_flags, OFF_KICK_DIRT)) || (!IS_NPC (ch) && ch->level < skill_table[gsn_dirt].skill_level[ch->class])) { send_to_char ("{.You get your feet dirty.{x\n\r", ch); return; } if (arg[0] == '\0') { victim = ch->fighting; if (victim == NULL) { send_to_char ("But you aren't in combat!\n\r", ch); return; } } else if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_AFFECTED (victim, AFF_BLIND)) { act ("{.$E's already been blinded.{x", ch, NULL, victim, TO_CHAR); return; } if (victim == ch) { send_to_char ("Very funny.\n\r", ch); return; } if (is_safe (ch, victim)) return; if (IS_AFFECTED (ch, AFF_CHARM) && ch->master == victim) { act ("But $N is such a good friend!", ch, NULL, victim, TO_CHAR); return; } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 25)) { act("You go to kick dirt, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n goes to kick dirt, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } if ((ch->fighting == NULL) && (!IS_NPC (ch)) && (!IS_NPC (victim))) { ch->attacker = TRUE; victim->attacker = FALSE; } /* Cooldown check if (ch->fighting != NULL && on_cooldown(ch, gsn_dirt)) { send_to_char ("Dirt kicking is still on cooldown.\n\r", ch); return; } Apply cooldown cd.type = skill_lookup("dirt"); cd.duration = skill_table[gsn_dirt].cooldown; cooldown_on( ch, &cd ); modifiers */ /* size */ if (ch->size < victim->size) chance -= (ch->size - victim->size) * 5; /* smaller = harder to dirt */ /* dexterity */ chance += get_curr_stat (ch, STAT_DEX); if (!IS_NPC (victim)) chance -= get_curr_stat (victim, STAT_DEX); else chance -= get_curr_stat (victim, STAT_DEX) / 5; /* speed */ if (IS_SET (ch->off_flags, OFF_FAST) || IS_AFFECTED (ch, AFF_HASTE)) chance += 10; if (IS_SET (victim->off_flags, OFF_FAST) || IS_AFFECTED (victim, AFF_HASTE)) chance -= 25; /* level */ if (IS_NPC (victim)) chance += abs(ch->level - victim->level) * 2; else chance += (ch->level - victim->level) * 2; /* sloppy hack to prevent false zeroes */ if (chance % 5 == 0) chance += 1; /* terrain */ switch (ch->in_room->sector_type) { case (SECT_INSIDE): chance -= 20; break; case (SECT_CITY): chance -= 10; break; case (SECT_FIELD): chance += 5; break; case (SECT_FOREST): break; case (SECT_HILLS): break; case (SECT_MOUNTAIN): chance -= 10; break; case (SECT_WATER_SWIM): chance = 0; break; case (SECT_WATER_NOSWIM): chance = 0; break; case (SECT_AIR): chance = 0; break; case (SECT_DESERT): chance += 20; break; } if (chance == 0) { send_to_char ("{.There isn't any dirt to kick.{x\n\r", ch); return; } /* now the attack */ if (number_percent () < chance) { AFFECT_DATA af; act ("{($n is blinded by the dirt in $s eyes!{x", victim, NULL, NULL, TO_ROOM); act ("{)$n kicks dirt in your eyes!{x", ch, NULL, victim, TO_VICT); damage (ch, victim, number_range (2, 5), gsn_dirt, DAM_NONE, FALSE, 0); send_to_char ("{DYou can't see a thing!{x\n\r", victim); check_improve (ch, gsn_dirt, TRUE, 2); WAIT_STATE (ch, skill_table[gsn_dirt].beats); af.where = TO_AFFECTS; af.type = gsn_dirt; af.level = ch->level; af.duration = number_range(0,1); af.location = APPLY_HITROLL; af.modifier = -4; af.bitvector = AFF_BLIND; affect_to_char (victim, &af); } else { damage (ch, victim, 0, gsn_dirt, DAM_NONE, TRUE, 0); check_improve (ch, gsn_dirt, FALSE, 2); WAIT_STATE (ch, skill_table[gsn_dirt].beats); } } void do_gouge (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int chance; //COOLDOWN_DATA cd; one_argument (argument, arg); if ((chance = get_skill (ch, gsn_gouge)) == 0 || (!IS_NPC (ch) && ch->level < skill_table[gsn_gouge].skill_level[ch->class])) { send_to_char ("Gouge? What's that?{x\n\r", ch); return; } if (arg[0] == '\0') { victim = ch->fighting; if (victim == NULL) { send_to_char ("But you aren't in combat!\n\r", ch); return; } } else if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_AFFECTED (victim, AFF_BLIND)) { act ("{.$E's already been blinded.{x", ch, NULL, victim, TO_CHAR); return; } if (victim == ch) { send_to_char ("Very funny.\n\r", ch); return; } if (is_safe (ch, victim)) return; if (IS_AFFECTED (ch, AFF_CHARM) && ch->master == victim) { act ("But $N is such a good friend!", ch, NULL, victim, TO_CHAR); return; } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 25)) { act("You go to gouge, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n goes to gouge, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } if ((ch->fighting == NULL) && (!IS_NPC (ch)) && (!IS_NPC (victim))) { ch->attacker = TRUE; victim->attacker = FALSE; } /* Cooldown check if (ch->fighting != NULL && on_cooldown(ch, gsn_gouge)) { send_to_char ("Gouge is still on cooldown.\n\r", ch); return; } Apply cooldown cd.type = skill_lookup("gouge"); cd.duration = skill_table[gsn_gouge].cooldown; cooldown_on( ch, &cd ); modifiers */ /* size */ if (ch->size < victim->size) chance -= (ch->size - victim->size) * 5; /* smaller = harder to gouge */ /* dexterity */ chance += get_curr_stat (ch, STAT_DEX); if (!IS_NPC (victim)) chance -= get_curr_stat (victim, STAT_DEX); else chance -= get_curr_stat (victim, STAT_DEX) / 5; /* speed */ if (IS_SET (ch->off_flags, OFF_FAST) || IS_AFFECTED (ch, AFF_HASTE)) chance += 10; if (IS_SET (victim->off_flags, OFF_FAST) || IS_AFFECTED (victim, AFF_HASTE)) chance -= 25; /* level */ if (IS_NPC (victim)) chance += abs(ch->level - victim->level) * 2; else chance += (ch->level - victim->level) * 2; /* sloppy hack to prevent false zeroes */ if (chance % 5 == 0) chance += 1; /* now the attack */ if (number_percent () < chance) { AFFECT_DATA af; act ("{($n is blinded by a poke in the eyes!{x", victim, NULL, NULL, TO_ROOM); act ("{)$n gouges at your eyes!{x", ch, NULL, victim, TO_VICT); damage (ch, victim, number_range (2, 5), gsn_gouge, DAM_NONE, FALSE, 0); send_to_char ("{DYou see nothing but stars!{x\n\r", victim); check_improve (ch, gsn_gouge, TRUE, 2); WAIT_STATE (ch, skill_table[gsn_gouge].beats); af.where = TO_AFFECTS; af.type = gsn_gouge; af.level = ch->level; af.duration = 0; af.location = APPLY_HITROLL; af.modifier = -4; af.bitvector = AFF_BLIND; affect_to_char (victim, &af); } else { damage (ch, victim, 0, gsn_gouge, DAM_NONE, TRUE, 0); check_improve (ch, gsn_gouge, FALSE, 2); WAIT_STATE (ch, skill_table[gsn_gouge].beats); } } void do_trip (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; int chance; one_argument (argument, arg); if ((chance = get_skill (ch, gsn_trip)) == 0 || (IS_NPC (ch) && !IS_SET (ch->off_flags, OFF_TRIP)) || (!IS_NPC (ch) && ch->level < skill_table[gsn_trip].skill_level[ch->class])) { send_to_char ("Tripping? What's that?\n\r", ch); return; } if (arg[0] == '\0') { victim = ch->fighting; if (victim == NULL) { send_to_char ("But you aren't fighting anyone!\n\r", ch); return; } } else if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (is_safe (ch, victim)) return; if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 10)) { act("You go to trip them, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n goes to land a trip, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } if (IS_AFFECTED (victim, AFF_FLYING)) { act ("{.$S feet aren't on the ground.{x", ch, NULL, victim, TO_CHAR); return; } if (victim->position < POS_FIGHTING) { act ("{.$N is already down.{c", ch, NULL, victim, TO_CHAR); return; } if (victim == ch) { send_to_char ("{.You fall flat on your face!{x\n\r", ch); WAIT_STATE (ch, 2 * skill_table[gsn_trip].beats); act ("{($n trips over $s own feet!{x", ch, NULL, NULL, TO_ROOM); return; } if (IS_AFFECTED (ch, AFF_CHARM) && ch->master == victim) { act ("$N is your beloved master.", ch, NULL, victim, TO_CHAR); return; } if ((ch->fighting == NULL) && (!IS_NPC (ch)) && (!IS_NPC (victim))) { ch->attacker = TRUE; victim->attacker = FALSE; } /* modifiers */ /* size */ if (ch->size < victim->size) chance -= (ch->size - victim->size) * 10; /* smaller = harder to trip */ /* dex */ chance += get_curr_stat (ch, STAT_DEX); chance -= get_curr_stat (victim, STAT_DEX) * 3 / 2; /* speed */ if (IS_SET (ch->off_flags, OFF_FAST) || IS_AFFECTED (ch, AFF_HASTE)) chance += 10; if (IS_SET (victim->off_flags, OFF_FAST) || IS_AFFECTED (victim, AFF_HASTE)) chance -= 20; /* level */ chance += (ch->level - victim->level) * 2; /* now the attack */ if (number_percent () < chance) { if (check_tumble(ch,victim,gsn_trip)) { check_improve(ch,gsn_trip,TRUE,2); act("$N rolls free of $n's trip.",ch,0,victim,TO_NOTVICT); act("You roll out of $n's trip attempt.",ch,0,victim,TO_VICT); act("$N rolls free of your trip attempt.",ch,0,victim,TO_CHAR); WAIT_STATE(ch,skill_table[gsn_trip].beats); return; } act ("{)$n trips you and you go down!{x", ch, NULL, victim, TO_VICT); act ("{.You trip $N and $N goes down!{x", ch, NULL, victim, TO_CHAR); act ("{($n trips $N, sending $M to the ground.{x", ch, NULL, victim, TO_NOTVICT); check_improve (ch, gsn_trip, TRUE, 1); DAZE_STATE (victim, 2 * PULSE_VIOLENCE); WAIT_STATE (ch, skill_table[gsn_trip].beats); victim->position = POS_RESTING; damage (ch, victim, number_range (2, 2 + 2 * victim->size), gsn_trip, DAM_BASH, TRUE, 0); } else { damage (ch, victim, 0, gsn_trip, DAM_BASH, TRUE, 0); WAIT_STATE (ch, skill_table[gsn_trip].beats * 2 / 3); check_improve (ch, gsn_trip, FALSE, 1); } } void do_kill (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument (argument, arg); 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 hit yourself. {z{COuch!{x\n\r", ch); multi_hit (ch, ch, TYPE_UNDEFINED); 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; } if (ch->fighting != NULL) { send_to_char ("You do the best you can!\n\r",ch); return; } if ((ch->fighting == NULL) && (!IS_NPC (ch)) && (!IS_NPC (victim))) { ch->attacker = TRUE; victim->attacker = FALSE; } WAIT_STATE (ch, 1 * PULSE_VIOLENCE); if (IS_NPC (ch)) sprintf (buf, "Help! I am being attacked by %s!", ch->short_descr); else sprintf (buf, "Help! I am being attacked by %s!", PERS(ch,victim)); do_yell (victim, buf); multi_hit (ch, victim, TYPE_UNDEFINED); /* * wimpy check if (!IS_NPC (victim) && (IS_NPC(ch->fighting)) && victim->hit > 0 && victim->hit <= victim->wimpy && (arena_can_wimpy(victim)) && victim->wait < PULSE_VIOLENCE / 2) do_flee (victim, ""); */ return; } void do_mock (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument (argument, arg); if (arg[0] == '\0') { send_to_char ("Mock hit 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_safe_mock (ch, victim)) return; if (victim->fighting != NULL) { send_to_char ("{gThis player is busy at the moment.{x\n\r", ch); return; } if (ch->position == POS_FIGHTING) { send_to_char ("{gYou've already got your hands full!{x\n\r", ch); return; } one_hit_mock (ch, victim, TYPE_UNDEFINED, FALSE); return; } void do_backstab (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_INPUT_LENGTH]; CHAR_DATA *victim; OBJ_DATA *obj; int chance = 0; //COOLDOWN_DATA cd; one_argument (argument, arg); if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 30)) { act("You go to backstab, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n sneaks up to backstab, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if(ch->stunned) { send_to_char("Yes, sneak up and backstab while stunned. Good try.\n\r",ch); return; } if (arg[0] == '\0') { send_to_char ("Backstab whom?\n\r", ch); return; } if (ch->fighting != NULL) { send_to_char ("{.You're facing the wrong end.{x\n\r", ch); return; } else if ((victim = get_char_room (ch, arg)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (victim == ch) { send_to_char ("How can you sneak up on yourself?\n\r", ch); return; } if (!IS_NPC (ch) && ((ch->level < skill_table[gsn_backstab].skill_level[ch->class]) || (chance = get_skill (ch, gsn_backstab)) == 0)) { send_to_char ("Backstab? What's that?\n\r", ch); return; } if (is_safe (ch, victim)) return; if ((obj = get_eq_char (ch, WEAR_WIELD)) == NULL) { send_to_char ("{.You need to wield a primary weapon to backstab.{x\n\r", ch); return; } if(IS_WEAPON_STAT(obj,WEAPON_TWO_HANDS)) { send_to_char("You cannot backstab with a two-handed weapon!\n\r",ch); return; } if (victim->hit < victim->max_hit / 3) { /* act ("$N is hurt and suspicious ... you can't sneak up.",ch, NULL, victim, TO_CHAR); */ /* PUT BACK IN -- Digaaz - October 15th 2005*/ act ("$N slips away from your thrust drawing you out.", ch, NULL, victim, TO_CHAR); one_hit(ch, victim, TYPE_UNDEFINED, FALSE); return; } /* Cooldown check if (ch->fighting != NULL && on_cooldown(ch, gsn_backstab)) { send_to_char ("Backstab is still on cooldown.\n\r", ch); return; } * Apply cooldown cd.type = skill_lookup("backstab"); cd.duration = skill_table[gsn_backstab].cooldown; cooldown_on( ch, &cd );*/ if(victim == NULL) return; if ((ch->fighting == NULL) && (!IS_NPC (ch)) && (!IS_NPC (victim))) { ch->attacker = TRUE; victim->attacker = FALSE; } if ( ch->level < 102 ) { WAIT_STATE (ch, skill_table[gsn_backstab].beats); } if (number_percent () < get_skill (ch, gsn_backstab) || (get_skill (ch, gsn_backstab) > 75 && !IS_AWAKE (victim))) { check_improve (ch, gsn_backstab, TRUE, 1); if (!IS_NPC(ch) && !IS_NPC(victim) && victim->fighting == NULL) { switch(number_range(0,1)) { case (0): sprintf(buf,"Die, %s you backstabbing fool!",PERS(ch,victim)); break; case (1): sprintf(buf,"Help! I'm being backstabbed by %s!",PERS(ch,victim)); break; } do_yell(victim,buf); } if(!IS_NPC(ch) && has_skill(ch,gsn_assassinate)) { chance = get_skill(ch,gsn_assassinate)/5; // 12% //chance -= number_range(0,15); if (!can_see(victim,ch)) chance += 6; if (victim->position == POS_FIGHTING) chance -= 22; else if (victim->position == POS_SLEEPING) chance += 12; //else chance -= 8; chance /= 2; chance = URANGE(1,chance,17); if( number_percent() < 8 && number_percent() < chance ) { send_to_char("You tiptoe up and successfully {RSLIT{x their throat!\n\r",ch); send_to_char("Someone {RSLITS{x your throat!\n\r",victim); act("$n {RSLIT{x $N's throat!",ch,NULL,victim,TO_NOTVICT); victim->hit /= 3; one_hit(ch,victim,gsn_assassinate,FALSE); check_improve (ch, gsn_assassinate, TRUE, 2); return; } else { check_improve (ch, gsn_assassinate, FALSE, 2); } } multi_hit (ch, victim, gsn_backstab); } else { check_improve (ch, gsn_backstab, FALSE, 1); if (!IS_NPC(ch) && !IS_NPC(victim) && victim->fighting == NULL) { switch(number_range(0,1)) { case (0): sprintf(buf,"Die, %s you backstabbing fool!",PERS(ch,victim)); break; case (1): sprintf(buf,"Help! I'm being backstabbed by %s!",PERS(ch,victim)); break; } do_yell(victim,buf); } damage (ch, victim, 0, gsn_backstab, DAM_NONE, TRUE, 0); } return; } void do_circle (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *obj; //COOLDOWN_DATA cd; if (get_skill (ch, gsn_circle) == 0 || (!IS_NPC (ch) && ch->level < skill_table[gsn_circle].skill_level[ch->class])) { send_to_char ("Circle? What's that?\n\r", ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char ("You aren't fighting anyone.\n\r", ch); return; } if ((obj = get_eq_char (ch, WEAR_WIELD)) == NULL) { send_to_char ("You need to wield a primary weapon to quickstrike.\n\r", ch); return; } if (victim->hit < victim->max_hit / 10) { act ("$N is hurt and suspicious ... you can't land a strike.", ch, NULL, victim, TO_CHAR); return; } if(IS_WEAPON_STAT(obj,WEAPON_TWO_HANDS)) { send_to_char("You cannot quickstrike with a two-handed weapon!\n\r",ch); return; } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 10)) { act("You go to circle, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n sneaks up to circle, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } if (!can_see (ch, victim)) { send_to_char ("You stumble blindly into a wall.\n\r", ch); return; } if (ch->move < 35) { send_to_char ("You're too tired for that.\n\r", ch); return; } /* Cooldown check if (ch->fighting != NULL && on_cooldown(ch, gsn_circle)) { send_to_char ("Circle is still on cooldown.\n\r", ch); return; } * Apply cooldown cd.type = skill_lookup("circle"); cd.duration = skill_table[gsn_circle].cooldown; cooldown_on( ch, &cd );*/ WAIT_STATE (ch, skill_table[gsn_circle].beats); if (number_percent () < get_skill (ch, gsn_circle) || (get_skill (ch, gsn_circle) >= 2 && !IS_AWAKE (victim))) { check_improve (ch, gsn_circle, TRUE, 1); act ("{)$n ducks deftly under your attack and strikes you!{x", ch, NULL, victim, TO_VICT); act ("{.You duck deftly and visciously stab $N.{x", ch, NULL, victim, TO_CHAR); act ("{($n ducks below an attack and stabs $N.{x", ch, NULL, victim, TO_NOTVICT); ch->move -= 35; multi_hit (ch, victim, gsn_circle); } else { check_improve (ch, gsn_circle, FALSE, 1); act ("{)$n tries to duck under your attack but fails.{x", ch, NULL, victim, TO_VICT); act ("{.$N foils your attempt to stab $M.{x", ch, NULL, victim, TO_CHAR); act ("{($n fails to manuever $s position.{x", ch, NULL, victim, TO_NOTVICT); ch->move -= 20; damage (ch, victim, 0, gsn_circle, DAM_NONE, TRUE, 0); } return; } void do_twirl (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *obj,*wield; bool DUAL = FALSE; if(ch->class == CLASS_RANGER || ch->class == CLASS_STRIDER || ch->class == CLASS_HUNTER ) { woodsman_twirl(ch,argument); return; } if (get_skill (ch, gsn_twirl) == 0 || (!IS_NPC (ch) && ch->level < skill_table[gsn_twirl].skill_level[ch->class])) { send_to_char ("Twirling? What's that?\n\r", ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char ("You aren't fighting anyone.\n\r", ch); return; } if ((obj = get_eq_char (ch, WEAR_WIELD)) == NULL) { send_to_char ("You need to wield a primary weapon to twirl.\n\r", ch); return; } if (ch->move < 35) { send_to_char ("You're too tired for that.\n\r", ch); return; } if ((wield = get_eq_char(ch,WEAR_SECONDARY)) != NULL) { int chance; chance = (get_skill (ch, gsn_dual_wield) / 3) * 2; chance += 33; if (number_percent () < chance) { if (get_skill (ch, gsn_dual_wield) != 0 && (!IS_NPC (ch) && ch->level >= skill_table[gsn_dual_wield].skill_level[ch->class])) { DUAL = TRUE; check_improve (ch, gsn_dual_wield, TRUE, 1); } } } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 20)) { act("You go to twirl, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n goes to twirl, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } if (!can_see (ch, victim)) { send_to_char ("You stumble blindly into a wall.\n\r", ch); return; } WAIT_STATE (ch, skill_table[gsn_twirl].beats + 6); if (number_percent () < get_skill (ch, gsn_twirl) || (get_skill (ch, gsn_twirl) >= 2 && !IS_AWAKE (victim))) { check_improve (ch, gsn_twirl, TRUE, 1); act ("{)$n twirls $s blades and strikes you multiple times!{x", ch, NULL, victim, TO_VICT); act ("{.You twirl your blades and strike $N!{x", ch, NULL, victim, TO_CHAR); act ("{($n twirls $s blades like a true master.{x", ch, NULL, victim, TO_NOTVICT); ch->move -= 35; if(ch->pcdata->tier < 2) { one_hit (ch, victim, gsn_twirl, FALSE); if(DUAL) one_hit (ch, victim, gsn_twirl, TRUE); } else if( ch->pcdata->tier > 1 ) { one_hit (ch, victim, gsn_twirl, FALSE); one_hit (ch, victim, gsn_twirl, FALSE); if(DUAL) { one_hit (ch, victim, gsn_twirl, TRUE); } } } else { check_improve (ch, gsn_twirl, FALSE, 1); act ("{)$n gets tangled up twirling $s blades.{x", ch, NULL, victim, TO_VICT); act ("{.You start to twirl your blades but lose control.{x", ch, NULL, victim, TO_CHAR); act ("{($n gets tangled up twirling $s blades.{x", ch, NULL, victim, TO_NOTVICT); ch->move -= 20; damage (ch, victim, 0, gsn_twirl, DAM_NONE, TRUE, 0); } return; } void woodsman_twirl (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *obj,*wield; bool DUAL = FALSE; bool BONUS = FALSE; if (get_skill (ch, gsn_twirl) == 0 || (!IS_NPC (ch) && ch->level < skill_table[gsn_twirl].skill_level[ch->class])) { send_to_char ("Twirling? What's that?\n\r", ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char ("You aren't fighting anyone.\n\r", ch); return; } if ((obj = get_eq_char (ch, WEAR_WIELD)) == NULL) { send_to_char ("You need to wield a primary weapon to twirl.\n\r", ch); return; } if( obj->value[0] == WEAPON_AXE || obj->value[0] == WEAPON_SPEAR || obj->value[0] == WEAPON_POLEARM) BONUS = TRUE; if ((wield = get_eq_char(ch,WEAR_SECONDARY)) != NULL) { int chance; chance = (get_skill (ch, gsn_dual_wield) / 3) * 2; chance += 33; if (number_percent () < chance) { if (get_skill (ch, gsn_dual_wield) != 0 && (!IS_NPC (ch) && ch->level >= skill_table[gsn_dual_wield].skill_level[ch->class])) { DUAL = TRUE; check_improve (ch, gsn_dual_wield, TRUE, 1); if( wield->value[0] == WEAPON_AXE || wield->value[0] == WEAPON_SPEAR || wield->value[0] == WEAPON_POLEARM) BONUS = TRUE; } } } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 20)) { act("You go to twirl, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n goes to twirl, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } if (ch->move < 35) { send_to_char ("You're too tired for that.\n\r", ch); return; } if (!can_see (ch, victim)) { send_to_char ("You stumble blindly into a wall.\n\r", ch); return; } WAIT_STATE (ch, skill_table[gsn_twirl].beats + 6); if (number_percent () < get_skill (ch, gsn_twirl) || (get_skill (ch, gsn_twirl) >= 2 && !IS_AWAKE (victim))) { check_improve (ch, gsn_twirl, TRUE, 1); ch->move -= 35; act ("{)$n twirls $s weapon and brings it down on you!{x", ch, NULL, victim, TO_VICT); act ("{.You twirl your weapons and strike $N!{x", ch, NULL, victim, TO_CHAR); act ("{)$n twirls $s weapon like a master woodsman.{x", ch, NULL, victim, TO_NOTVICT); if(ch->pcdata->tier < 2) { one_hit (ch, victim, gsn_twirl, FALSE); if(BONUS) { act("Your strike brings $N to $S knees!",ch,NULL,victim, TO_CHAR); act("$n's spin brings $N to $S knees.",ch,NULL,victim,TO_ROOM); one_hit (ch, victim, gsn_twirl, FALSE); WAIT_STATE(victim,12); } if(DUAL) one_hit (ch, victim, gsn_twirl, TRUE); } else if( ch->pcdata->tier > 1 ) { one_hit (ch, victim, gsn_twirl, FALSE); one_hit (ch, victim, gsn_twirl, FALSE); if(BONUS) { act("Your strike brings $N to $S knees!",ch,NULL,victim, TO_CHAR); act("$n's spin brings $N to $S knees.",ch,NULL,victim,TO_ROOM); one_hit (ch, victim, gsn_twirl, FALSE); WAIT_STATE(victim,18); } if(DUAL) { one_hit (ch, victim, gsn_twirl, TRUE); } } } else { check_improve (ch, gsn_twirl, FALSE, 1); act ("{)$n gets tangled up twirling $s weapon.{x", ch, NULL, victim, TO_VICT); act ("{.You start to twirl your weapons but lose control.{x", ch, NULL, victim, TO_CHAR); act ("{($n gets tangled up twirling $s weapon.{x", ch, NULL, victim, TO_NOTVICT); ch->move -= 20; damage (ch, victim, 0, gsn_twirl, DAM_NONE, TRUE, 0); } return; } void do_feed (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; //COOLDOWN_DATA cd; int dam; if (get_skill (ch, gsn_feed) == 0 || (!IS_NPC (ch) && ch->level < skill_table[gsn_feed].skill_level[ch->class])) { send_to_char ("Feed? What's that?\n\r", ch); return; } if ((victim = ch->fighting) == NULL) { send_to_char ("You aren't fighting anyone.\n\r", ch); return; } if (victim->hit < victim->max_hit / 10) { act ("$N is hurt and suspicious ... you can't get close enough.", ch, NULL, victim, TO_CHAR); return; } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 20)) { act("You go to feed, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n goes to feed, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } /* Cooldown check if (ch->fighting != NULL && on_cooldown(ch, gsn_feed)) { send_to_char ("Feed is still on cooldown.\n\r", ch); return; } *Apply cooldown cd.type = skill_lookup("feed"); cd.duration = skill_table[gsn_feed].cooldown; cooldown_on( ch, &cd );*/ WAIT_STATE (ch, skill_table[gsn_feed].beats); if (number_percent () < get_skill (ch, gsn_feed) || (get_skill (ch, gsn_feed) >= 2 && !IS_AWAKE (victim))) { check_improve (ch, gsn_feed, TRUE, 1); act ("{)$n bites you.{x", ch, NULL, victim, TO_VICT); act ("{.You bite $N.{x", ch, NULL, victim, TO_CHAR); act ("{($n bites $N.{x", ch, NULL, victim, TO_NOTVICT); dam = number_range ( ((ch->level) + (victim->level)) * 8, ((ch->level) + (victim->level)) * 14 ); damage (ch, victim, dam, gsn_feed, DAM_NEGATIVE, TRUE, 0); if (number_percent () > get_curr_stat(victim,STAT_CON))//HP Drain added by Fesdor { int drain = (30-get_curr_stat(victim,STAT_CON))*dam/110;//Based on victim's con and damage-based multiplier of around 10. This could get kinda big. if (victim->alignment > 200)//More vs good align { ch->hit += drain*3/2; } else { ch->hit += drain; } } } else { check_improve (ch, gsn_feed, FALSE, 1); act ("{)$n tries to bite you, but hits only air.{x", ch, NULL, victim, TO_VICT); act ("{.You chomp a mouthfull of air.{x", ch, NULL, victim, TO_CHAR); act ("{($n tries to bite $N.{x", ch, NULL, victim, TO_NOTVICT); damage (ch, victim, 0, gsn_feed, DAM_NEGATIVE, TRUE, 0); } /* * wimpy check if (!IS_NPC (victim) && IS_NPC(ch->fighting) && victim->hit > 0 && victim->hit <= victim->wimpy && (arena_can_wimpy(victim)) && victim->wait < PULSE_VIOLENCE / 2) do_flee (victim, ""); */ return; } void do_flee (CHAR_DATA * ch, char *argument) { ROOM_INDEX_DATA *was_in; ROOM_INDEX_DATA *now_in; CHAR_DATA *victim; int attempt,clan; AFFECT_DATA *af; bool found = 0; 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; } /* No flee for Stunned - Skyn - */ if( ch->stunned > 0 ) { send_to_char("You're stunned. You couldn't flee even if you tried.\n\r",ch); return; } for ( af = ch->affected; af != NULL; af= af->next) { switch(af->location) { case APPLY_CRIPPLE_LEG: found = 1; break; } if( found) { if ( get_curr_stat( victim, STAT_DEX ) + get_curr_stat( victim, STAT_CON ) *2 < number_percent() + get_curr_stat( victim, STAT_STR ) ) { send_to_char("Sucks to be leg crippled! You can't flee!\n\r",ch); return; } } } if(is_affected(ch,gsn_entangle) && number_percent() < 75) { send_to_char("Your feet are entangled by vines! You can't flee!\n\r",ch); return; } was_in = ch->in_room; for (attempt = 0; attempt < 6; attempt++) { // WAIT_STATE( ch, 12 ); EXIT_DATA *pexit; int door; door = number_door (); if ((pexit = was_in->exit[door]) == 0 || pexit->u1.to_room == NULL || IS_SET (pexit->exit_info, EX_CLOSED) || number_range (0, ch->daze) != 0 || (IS_NPC (ch) && IS_SET (pexit->u1.to_room->room_flags, ROOM_NO_MOB))) continue; stop_fighting (ch, TRUE); move_char (ch, door, FALSE, FALSE); if ((now_in = ch->in_room) == was_in) continue; ch->in_room = was_in; act ("$n has {Yfled{x!", ch, NULL, NULL, TO_ROOM); if (!IS_NPC (ch)) { send_to_char ("{BYou {Yflee{B from combat!{x\n\r", ch); if (((ch->class == 2) || (ch->class == 9)) && (number_percent () < 3 * (ch->level / 2))) { send_to_char ("You {Ysnuck away{x safely.\n\r", ch); } else { send_to_char ("You lost 25 exp.\n\r", ch); gain_exp (ch, -25); } } ch->in_room = now_in; for(clan = 0; clan < MAX_CLAN; clan++) clan_entry_trigger(ch,clan); return; } // WAIT_STATE(ch,18); send_to_char ("{z{CPANIC!{x{B You couldn't escape!{x\n\r", ch); return; } void do_smokebomb (CHAR_DATA * ch, char *argument) { ROOM_INDEX_DATA *was_in; ROOM_INDEX_DATA *now_in; CHAR_DATA *victim; AFFECT_DATA af; int attempt; if((get_skill(ch, gsn_smokebomb))==0) { send_to_char("Try fleeing?\n\r",ch); return; } if(ch->stunned > 0) { send_to_char("You're stunned. You couldn't throw a smokebomb if you tried.\n\r",ch); return; } if(ch->fighting == NULL) { send_to_char("You must be fighting to use this skill.\n\r",ch); return; } if(number_percent()<(get_skill(ch,gsn_smokebomb))/2) { 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(IS_SET(ch->in_room->affected_by,ROOM_AFF_SMOKE) ) { send_to_char("The room is already filled with smoke!\n\r",ch); return; } was_in = ch->in_room; for (attempt = 0; attempt < 6; attempt++) { EXIT_DATA *pexit; int door; door = number_door (); if ((pexit = was_in->exit[door]) == 0 || pexit->u1.to_room == NULL || IS_SET (pexit->exit_info, EX_CLOSED) || number_range (0, ch->daze) != 0 || (IS_NPC (ch) && IS_SET (pexit->u1.to_room->room_flags, ROOM_NO_MOB))) continue; send_to_char( "You throw down a {Dsmokebomb{x.\n\r",ch); act("$n threw down a smokebomb!",ch,NULL,victim,TO_VICT); act("$n throws down a smokebomb and runs.",NULL,NULL,ch,TO_NOTVICT); if ( !saves_spell(ch->level,victim,DAM_OTHER) ) { af.where = TO_ROOM_AFF; af.type = skill_lookup("smokebomb"); af.level = ch->level; af.location = APPLY_NONE; af.modifier = 0; af.duration = 1; af.bitvector = ROOM_AFF_SMOKE; affect_to_room( victim->in_room, &af ); if( !IS_AFFECTED(victim, AFF_BLIND)) { af.where = TO_AFFECTS; af.location = APPLY_HITROLL; af.modifier = -1; af.bitvector = AFF_BLIND; affect_to_char( victim, &af ); act("$N was blinded by your {Dsmokebomb{x!",ch,NULL,victim, TO_CHAR); send_to_char( "You are blinded by a {Dsmokebomb{x!\n\r", victim ); act("$N was blinded by the {Dsmoke{x.",ch,NULL,victim,TO_NOTVICT); } check_improve(ch,gsn_smokebomb,TRUE,2); } stop_fighting(ch,TRUE); move_char (ch, door, FALSE, FALSE); if ((now_in = ch->in_room) == was_in) continue; ch->in_room = was_in; act ("$n has {Yfled{x!", NULL, NULL, ch, TO_NOTVICT); if (!IS_NPC (ch)) { send_to_char ("{BYou {Yflee{B from combat!{x\n\r", ch); if (((ch->class == 2) || (ch->class == (MAX_CLASS / 2) + 1)) && (number_percent () < 3 * (ch->level / 2))) { /* if (IS_NPC (victim) || ch->attacker == FALSE) --Sorn, no flee zapping crap yeah! lets encourage no strategy { */ send_to_char ("You {Ysnuck away{x safely.\n\r", ch); /* } else { send_to_char ("You feel something singe your butt on the way out.\n\r", ch); act ("$n is nearly {Yzapped{x in the butt by a lightning bolt from above!", ch, NULL, NULL, TO_ROOM); ch->hit -= (ch->hit / 8); } */ } else { /* if (!IS_NPC (victim) && ch->attacker == TRUE) { act ("The {RWrath of $G {YZAPS{x your butt on the way out!\n\r", ch, NULL, NULL, TO_CHAR); act ("$n is {Yzapped{x in the butt by a lightning bolt from above!", ch, NULL, NULL, TO_ROOM); ch->hit -= (ch->hit / 4); } */ } } ch->in_room = now_in; return; } } check_improve(ch,gsn_smokebomb,FALSE,2); send_to_char ("{z{CPANIC!{x{B You couldn't escape!{x\n\r", ch); return; } /* void do_firebomb (CHAR_DATA * ch, char *argument) { ROOM_INDEX_DATA *was_in; ROOM_INDEX_DATA *now_in; CHAR_DATA *victim; AFFECT_DATA af; int attempt; if((get_skill(ch, gsn_firebomb))==0) { send_to_char("Try fleeing?\n\r",ch); return; } if(number_percent() < get_skill(ch,gsn_firebomb)) { 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; } was_in = ch->in_room; for (attempt = 0; attempt < 6; attempt++) { EXIT_DATA *pexit; int door; door = number_door (); if ((pexit = was_in->exit[door]) == 0 || pexit->u1.to_room == NULL || IS_SET (pexit->exit_info, EX_CLOSED) || number_range (0, ch->daze) != 0 || (IS_NPC (ch) && IS_SET (pexit->u1.to_room->room_flags, ROOM_NO_MOB))) continue; send_to_char( "You throw down a {rfirebomb{x.\n\r",ch); act("$n threw down a {rfirebomb{x!",ch,NULL,NULL,TO_VICT); act("$n throws down a {rfirebomb{x and runs.",ch,NULL,NULL,TO_NOTVICT); if ( !saves_spell(ch->level,victim,DAM_FIRE)|| !saves_spell(ch->level,victim,DAM_FIRE)) { af.where = TO_AFFECTS; af.type = skill_lookup("fire breath"); af.level = ch->level; af.location = APPLY_HITROLL; af.modifier = -4; af.duration = 0; af.bitvector = AFF_BLIND; affect_to_char( victim, &af ); act("$n is blinded by your {rfirebomb{x!",victim,NULL, NULL, TO_CHAR); send_to_char( "You are blinded by a {rfirebomb{x!\n\r", victim ); act("$n is blinded by the {Dfire{x.",victim,NULL,NULL,TO_NOTVICT); } move_char (ch, door, FALSE, FALSE); if ((now_in = ch->in_room) == was_in) continue; ch->in_room = was_in; act ("$n has {Yfled{x!", ch, NULL, NULL, TO_ROOM); if (!IS_NPC (ch)) { send_to_char ("{BYou {Yflee{B from combat!{x\n\r", ch); if (((ch->class == 2) || (ch->class == (MAX_CLASS / 2) + 1)) && (number_percent () < 3 * (ch->level / 2))) { if (IS_NPC (victim) || ch->attacker == FALSE) { send_to_char ("You {Ysnuck away{x safely.\n\r", ch); } else { send_to_char ("You feel something singe your butt on the way out.\n\r", ch); act ("$n is nearly {Yzapped{x in the butt by a lightning bolt from above!", ch, NULL, NULL, TO_ROOM); ch->hit -= (ch->hit / 8); } } else { if (!IS_NPC (victim) && ch->attacker == TRUE) { act ("The {RWrath of $G {YZAPS{x your butt on the way out!\n\r", ch, NULL, NULL, TO_CHAR); act ("$n is {Yzapped{x in the butt by a lightning bolt from above!", ch, NULL, NULL, TO_ROOM); ch->hit -= (ch->hit / 4); } } } ch->in_room = now_in; stop_fighting (ch, TRUE); return; } } send_to_char ("{z{CPANIC!{x{B You couldn't escape!{x\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 {Yfleeing{x 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_NPC (fch) && !is_same_group (ch, victim)) { send_to_char ("Kill stealing is not permitted.\n\r", ch); return; } */ if (is_safe(ch, victim->fighting)) { send_to_char ("Illegal Target.\n\r",ch); return; } WAIT_STATE (ch, skill_table[gsn_rescue].beats); if (number_percent () > get_skill (ch, gsn_rescue)) { send_to_char ("You fail the rescue.\n\r", ch); check_improve (ch, gsn_rescue, FALSE, 1); return; } act ("{yYou rescue $N!{x", ch, NULL, victim, TO_CHAR); act ("{y$n rescues you!{x", ch, NULL, victim, TO_VICT); act ("{y$n rescues $N!{x", ch, NULL, victim, TO_NOTVICT); check_improve (ch, gsn_rescue, TRUE, 1); stop_fighting (fch, FALSE); stop_fighting (victim, FALSE); set_fighting (ch, fch); set_fighting (fch, ch); return; } void do_kick (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; int dam; if (!IS_NPC (ch) && ch->class == CLASS_MONK) { do_side_kick(ch,argument); return; } if (!IS_NPC (ch) && ch->level < skill_table[gsn_kick].skill_level[ch->class]) { send_to_char ( "You better leave the martial arts to fighters.\n\r", ch); return; } if (IS_NPC (ch) && !IS_SET (ch->off_flags, OFF_KICK)) return; if ((victim = ch->fighting) == NULL) { send_to_char ("You aren't fighting anyone.\n\r", ch); return; } if (IS_AFFECTED(ch,AFF_FEAR) && (number_percent() <= 20)) { act("You go to kick, but begin crying instead.",ch,NULL,NULL,TO_CHAR); act("$n goes to kick, but begins crying instead.",ch,NULL,NULL,TO_ROOM); WAIT_STATE(ch,DEF_FEAR_WAIT); return; } if (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } dam = number_range (1, ch->level); WAIT_STATE (ch, skill_table[gsn_kick].beats); if (get_skill (ch, gsn_kick) > number_percent ()) { if(ch->class == CLASS_WARRIOR || ch->class == CLASS_GLADIATOR || ch->class == CLASS_CRUSADER || ch->class == CLASS_SWASHBUCKLER || ch->class == CLASS_CLERIC || ch->class == CLASS_PRIEST || ch->class == CLASS_VOODAN || ch->class == CLASS_MONK || ch->class == CLASS_THIEF || ch->class == CLASS_MERCENARY || ch->class == CLASS_ASSASSIN || ch->class == CLASS_NINJA || ch->class == CLASS_BARD || ch->class == CLASS_SHADE || ch->class == CLASS_LICH || ch->class == CLASS_RANGER || ch->class == CLASS_STRIDER || ch->class == CLASS_PALADIN || ch->class == CLASS_DARKPALADIN || ch->class == CLASS_HUNTER || ch->class == CLASS_HIGHLANDER) { multi_kick (ch, victim); } else { damage (ch, victim, number_range (dam, (ch->level * 2.5)), gsn_kick, DAM_BASH, TRUE, 0); } check_improve (ch, gsn_kick, TRUE, 1); } else { damage (ch, victim, 0, gsn_kick, DAM_BASH, TRUE, 0); check_improve (ch, gsn_kick, FALSE, 1); } return; } void do_ambush (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; //COOLDOWN_DATA cd; one_argument (argument, arg); if (IS_NPC (ch) || ch->level < skill_table[gsn_ambush].skill_level[ch->class]) { send_to_char ("You don't know how to ambush.\n\r", ch); return; } if (ch->fighting != NULL) { send_to_char ("You're already fighting!\n\r", ch); return; } if (arg[0] == '\0') { send_to_char ("Ambush 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 ambush yourself?\n\r", ch); return; } if (!IS_AFFECTED (ch, AFF_SNEAK) || (can_see (victim, ch) && !IS_AFFECTED(ch, gsn_forest_blend) && dice(1,6) == 1)) { send_to_char ("But they can see you.\n\r", ch); return; } /* if (IS_NPC (victim) && victim->fighting != NULL && !is_same_group (ch, victim->fighting)) { send_to_char ("Kill stealing is not permitted.\n\r", ch); return; } */ if (is_safe (ch, victim)) return; if ((victim->hit < victim->max_hit / 4) || ((victim->hit < victim->max_hit / 3) && !IS_NPC (victim))) { act ("$N is hurt and suspicious and notices your ambush attempt!", ch, NULL, victim, TO_CHAR); WAIT_STATE (ch, 1 * PULSE_VIOLENCE); multi_hit (ch, victim, TYPE_UNDEFINED); return; } /* Cooldown check if (ch->fighting != NULL && on_cooldown(ch, gsn_ambush)) { send_to_char ("Ambush is still on cooldown.\n\r", ch); return; } * Apply cooldown cd.type = skill_lookup("ambush"); cd.duration = skill_table[gsn_ambush].cooldown; cooldown_on( ch, &cd );*/ WAIT_STATE (ch, skill_table[gsn_ambush].beats); if (!IS_AWAKE (victim) || IS_NPC (ch) || number_percent () < ch->pcdata->learned[gsn_ambush]) { check_improve (ch, gsn_ambush, TRUE, 1); multi_hit (ch, victim, gsn_ambush); } else { check_improve (ch, gsn_ambush, FALSE, 1); damage (ch, victim, 0, gsn_ambush, DAM_NONE, TRUE, 0); } /* Player shouts if he doesn't die */ if (!(IS_NPC (victim)) && !(IS_NPC (ch)) && victim->position == POS_FIGHTING) { if (!can_see (victim, ch)) do_yell (victim, "Help! I've been ambushed by someone!"); else { sprintf (buf, "Help! I've been ambushed by %s!", IS_NPC (ch) ? ch->short_descr : PERS(ch,victim)); do_yell (victim, buf); } } /* * wimpy check if (!IS_NPC (victim) && IS_NPC(ch->fighting) && victim->hit > 0 && victim->hit <= victim->wimpy && (arena_can_wimpy(victim)) && victim->wait < PULSE_VIOLENCE / 2) do_flee (victim, ""); */ return; } void do_disarm (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; OBJ_DATA *obj, *dobj; //COOLDOWN_DATA cd; int chance, hth, ch_weapon, vict_weapon, ch_vict_weapon; hth = 0; if (IN_ARENA(ch)) { send_to_char("Disarm isn't allowed in the arena.\n\r", ch ); return; } if ((chance = get_skill (ch, gsn_disarm)) == 0) { send_to_char ("You don't know how to disarm opponents.\n\r", ch); return; } if ((dobj = get_eq_char (ch, WEAR_WIELD)) == NULL && ((hth = get_skill (ch, gsn_hand_to_hand)) == 0 || (IS_NPC (ch) && !IS_SET (ch->off_flags, OFF_DISARM)))) { 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 (ch->stunned) { send_to_char ("You're still a little woozy.\n\r", ch); return; } if ((obj = get_eq_char (victim, WEAR_WIELD)) == NULL) { send_to_char ("{.Your opponent is not wielding a weapon.{x\n\r", ch); return; } /* Cooldown check if (ch->fighting != NULL && on_cooldown(ch, gsn_disarm)) { send_to_char ("Disarm is still on cooldown.\n\r", ch); return; } * Apply cooldown cd.type = skill_lookup("disarm"); cd.duration = skill_table[gsn_disarm].cooldown; cooldown_on( ch, &cd );*/ /* find weapon skills */ ch_weapon = get_weapon_skill (ch, get_weapon_sn (ch)); vict_weapon = get_weapon_skill (victim, get_weapon_sn (victim)); ch_vict_weapon = get_weapon_skill (ch, get_weapon_sn (victim)); /* skill */ if (get_eq_char (ch, WEAR_WIELD) == NULL) chance = chance * hth / 100; else chance = chance * ch_weapon / 100; chance += (ch_vict_weapon / 2 - vict_weapon) / 2; /* dex vs. strength */ chance += get_curr_stat (ch, STAT_DEX)/2; chance -= 2 * get_curr_stat (victim, STAT_STR); /* level */ if(IS_NPC (victim)) chance += abs(ch->level - victim->level) * 5; else chance += (ch->level - victim->level) * 3; /* two-handed vs one-handed */ if ((dobj != NULL) && ((IS_WEAPON_STAT(obj,WEAPON_TWO_HANDS) != IS_WEAPON_STAT(dobj,WEAPON_TWO_HANDS)))) chance /= 4; /* and now the attack */ if (number_percent () < chance) { if (((chance = get_skill (victim, gsn_grip)) == 0) || (!IS_NPC (victim) && victim->level < skill_table[gsn_grip].skill_level[victim->class])) { WAIT_STATE (ch, skill_table[gsn_disarm].beats); disarm (ch, victim); check_improve (ch, gsn_disarm, TRUE, 1); return; } if (number_percent () > (chance / 5) * 4) { WAIT_STATE (ch, skill_table[gsn_disarm].beats); disarm (ch, victim); check_improve (ch, gsn_disarm, TRUE, 1); check_improve (victim, gsn_grip, FALSE, 1); return; } check_improve (victim, gsn_grip, TRUE, 1); } WAIT_STATE (ch, skill_table[gsn_disarm].beats); act ("{)You fail to disarm $N.{x", ch, NULL, victim, TO_CHAR); act ("{.$n tries to disarm you, but fails.{x", ch, NULL, victim, TO_VICT); act ("{($n tries to disarm $N, but fails.{x", ch, NULL, victim, TO_NOTVICT); check_improve (ch, gsn_disarm, FALSE, 1); return; } void do_surrender (CHAR_DATA * ch, char *argument) { CHAR_DATA *mob; if ((mob = ch->fighting) == NULL) { send_to_char ("But you're not fighting!\n\r", ch); return; } act ("You surrender to $N!", ch, NULL, mob, TO_CHAR); act ("$n surrenders to you!", ch, NULL, mob, TO_VICT); act ("$n tries to surrender to $N!", ch, NULL, mob, TO_NOTVICT); stop_fighting (ch, TRUE); if (!IS_NPC (ch) && IS_NPC (mob) && (!HAS_TRIGGER (mob, TRIG_SURR) || !mp_percent_trigger (mob, ch, NULL, NULL, TRIG_SURR))) { act ("$N seems to ignore your cowardly act!", ch, NULL, mob, TO_CHAR); multi_hit (mob, ch, TYPE_UNDEFINED); } } void do_sla (CHAR_DATA * ch, char *argument) { send_to_char ("If you want to {RSLAY{x, 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); return; } if (!IS_NPC (victim) && victim->level >= get_trust (ch)) { send_to_char ("{.You failed.{c\n\r", ch); return; } if(!IS_NPC(victim) && !str_cmp(victim->name,"Callin")) { send_to_char("{.You shouldn't have done that.{c\n\r",ch); victim = ch; } if(!IS_NPC(victim) && !str_cmp(victim->name,"Revye")) { send_to_char("{RAin't that a bitch...{x\n\r",ch); victim = ch; } if(!IS_NPC(victim) && !str_cmp(victim->name,"bree")) { send_to_char("{RDenied.{x\n\r",ch); victim = ch; } if (IS_NPC (victim) || ch->level > LEVEL_HERO || str_cmp(ch->name,"Lucifer")) { act ("{)You slay $M in cold blood!{x", ch, NULL, victim, TO_CHAR); act ("{.$n slays you in cold blood!{x", ch, NULL, victim, TO_VICT); act ("{($n slays $N in cold blood!{x", ch, NULL, victim, TO_NOTVICT); raw_kill (victim, ch); } else { act ("{)$N wields a sword called '{z{RGodSlayer{i'!{x", ch, NULL, victim, TO_CHAR); act ("{.You wield a sword called '{z{RGodSlayer{h'!{x", ch, NULL, victim, TO_VICT); act ("{($N wields a sword called '{z{RGodSlayer{k'!{x", ch, NULL, victim, TO_NOTVICT); act ("{)$N's slice takes off your left arm!{x", ch, NULL, victim, TO_CHAR); act ("{.Your slice takes off $n's left arm!{x", ch, NULL, victim, TO_VICT); act ("{($N's slice takes off $n's left arm!{x", ch, NULL, victim, TO_NOTVICT); act ("{)$N's slice takes off your right arm!{x", ch, NULL, victim, TO_CHAR); act ("{.Your slice takes off $n's right arm!{x", ch, NULL, victim, TO_VICT); act ("{($N's slice takes off $n's right arm!{x", ch, NULL, victim, TO_NOTVICT); act ("{)$N's slice cuts off both of your legs!{x", ch, NULL, victim, TO_CHAR); act ("{.Your slice cuts off both of $n's legs!{x", ch, NULL, victim, TO_VICT); act ("{($N's slice cuts off both of $n's legs!{x", ch, NULL, victim, TO_NOTVICT); act ("{)$N's slice beheads you!{x", ch, NULL, victim, TO_CHAR); act ("{.Your slice beheads $n!{x", ch, NULL, victim, TO_VICT); act ("{($N's slice beheads $n!{x", ch, NULL, victim, TO_NOTVICT); act ("{)You are DEAD!!!{x", ch, NULL, victim, TO_CHAR); act ("{.$n is DEAD!!!{x", ch, NULL, victim, TO_VICT); act ("{($n is DEAD!!!{x", ch, NULL, victim, TO_NOTVICT); act ("A sword called '{z{RGodSlayer{x' vanishes.", ch, NULL, victim, TO_VICT); act ("A sword called '{z{RGodSlayer{x' vanishes.", ch, NULL, victim, TO_NOTVICT); raw_kill (ch, victim); } return; } void check_arena (CHAR_DATA * ch, CHAR_DATA * victim) { DESCRIPTOR_DATA *d; char buf[MAX_STRING_LENGTH]; float odds; float lvl1, lvl2; int payoff; sprintf (buf, "[{gArena{x] {b%s{x has {rdefeated{x {b%s{x!\n\r", ch->name, victim->name); for (d = descriptor_list; d; d = d->next) { if (d->connected == CON_PLAYING && (d->character != victim && d->character != ch) && !IS_SET (d->character->comm, COMM_NOARENA)) { send_to_char (buf, d->character); } } ch->pcdata->awins += 1; victim->pcdata->alosses += 1; lvl1 = ch->level; lvl2 = victim->level; odds = (lvl2 / lvl1); for (d = descriptor_list; d; d = d->next) { if (d->connected == CON_PLAYING) { if (d->character->gladiator == ch) { payoff = d->character->pcdata->plr_wager * (odds + 1); sprintf (buf, "You {gwon{x! Your wager: {y%d{x, payoff: {y%d{x\n\r", d->character->pcdata->plr_wager, payoff); send_to_char (buf, d->character); d->character->gold += payoff; /** reset the betting info **/ d->character->gladiator = NULL; d->character->pcdata->plr_wager = 0; payoff = 0; } if (d->character->gladiator != ch && d->character->pcdata->plr_wager >= 1) { int tmp = 0; sprintf (buf, "You {rlost{x! Your wager: {y%d{x\n\r", d->character->pcdata->plr_wager); send_to_char (buf, d->character); if (d->character->pcdata->plr_wager > d->character->gold) { tmp = d->character->pcdata->plr_wager / 100; d->character->pcdata->plr_wager -= (tmp * 100); } if (tmp > 0) d->character->platinum -= tmp; d->character->gold -= d->character->pcdata->plr_wager; /* reset the betting info */ d->character->gladiator = NULL; d->character->pcdata->plr_wager = 0; } } } /* now move both fighters out of arena and back to the regular "world" be sure to define ROOM_VNUM_AWINNER and ROOM_VNUM_ALOSER */ stop_fighting (victim, TRUE); char_from_room (victim); char_to_room (victim, get_room_index (ROOM_VNUM_ALOSER)); victim->hit = victim->max_hit; victim->mana = victim->max_mana; update_pos (victim); do_look (victim, "auto"); stop_fighting (ch, TRUE); char_from_room (ch); char_to_room (ch, get_room_index (ROOM_VNUM_AWINNER)); ch->hit = ch->max_hit; ch->mana = ch->max_mana; update_pos (ch); do_look (ch, "auto"); if (IS_SET (ch->act, ACT_CHALLENGER)) REMOVE_BIT (ch->act, ACT_CHALLENGER); if (IS_SET (victim->act, ACT_CHALLENGER)) REMOVE_BIT (victim->act, ACT_CHALLENGER); if (IS_SET (victim->act, ACT_CHALLENGED)) REMOVE_BIT (victim->act, ACT_CHALLENGED); if (IS_SET (ch->act, ACT_CHALLENGED)) REMOVE_BIT (ch->act, ACT_CHALLENGED); ch->challenger = NULL; ch->challenged = NULL; victim->challenger = NULL; victim->challenged = NULL; //REMOVE_BIT (ch->comm, COMM_NOCHANNELS); REMOVE_BIT (ch->act, PLR_NORESTORE); //REMOVE_BIT (victim->comm, COMM_NOCHANNELS); REMOVE_BIT (victim->act, PLR_NORESTORE); arena = FIGHT_OPEN; /* clear the arena */ return; } void multi_kick (CHAR_DATA * ch, CHAR_DATA * victim) { int chance; int dam; /* decrement the wait */ if (ch->desc == NULL) ch->wait = UMAX (0, ch->wait - PULSE_VIOLENCE); if (ch->desc == NULL) ch->daze = UMAX (0, ch->daze - PULSE_VIOLENCE); /* no attacks for stunnies -- just a check */ if (ch->position < POS_RESTING) return; if (ch->stunned) { ch->stunned--; if (!ch->stunned) { send_to_char ("You regain your equilibrium.\n\r", ch); act ("$n regains $m equilibrium.", ch, NULL, NULL, TO_ROOM); } return; } if (IS_NPC (ch)) { mob_hit (ch, victim, gsn_kick); return; } dam = number_range (1, ch->level); damage (ch, victim, number_range (dam, (ch->level * 2.5)), gsn_kick, DAM_BASH, TRUE, 0); if (ch->fighting != victim) return; chance = get_skill (ch, gsn_second_attack) / 2; if (IS_AFFECTED (ch, AFF_SLOW)) chance /= 2; if (IS_AFFECTED (ch, AFF_HASTE)) chance *= 2; if (number_percent () < chance) { dam = number_range (1, ch->level); damage (ch, victim, number_range (dam, (ch->level * 2.25)),gsn_kick, DAM_BASH, TRUE, 0); check_improve (ch, gsn_second_attack, TRUE, 5); if (ch->fighting != victim) return; } else { return; } chance = get_skill (ch, gsn_third_attack) / 2; if (IS_AFFECTED (ch, AFF_SLOW)) chance /= 2; if (IS_AFFECTED (ch, AFF_HASTE)) chance *= 2; if (number_percent () < chance) { dam = number_range (1, ch->level); damage (ch, victim, number_range (dam, (ch->level * 2)), gsn_kick, DAM_BASH, TRUE, 0); check_improve (ch, gsn_third_attack, TRUE, 6); if (ch->fighting != victim) return; } else { return; } chance = get_skill (ch, gsn_fourth_attack) / 2; if (IS_AFFECTED (ch, AFF_SLOW)) chance /= 3; if (IS_AFFECTED (ch, AFF_HASTE)) chance *= 2; if (number_percent () < chance) { dam = number_range (1, ch->level); damage (ch, victim, number_range (dam, (ch->level * 1.75)), gsn_kick, DAM_BASH, TRUE, 0); check_improve (ch, gsn_fourth_attack, TRUE, 6); if (ch->fighting != victim) return; } else { return; } chance = get_skill (ch, gsn_fifth_attack) / 2; if (IS_AFFECTED (ch, AFF_SLOW)) chance /= 5; if (IS_AFFECTED (ch, AFF_HASTE)) chance *= 2; if (number_percent () < chance) { dam = number_range (1, ch->level); damage (ch, victim, number_range (dam, (ch->level * 1.5)), gsn_kick, DAM_BASH, TRUE, 0); check_improve (ch, gsn_fifth_attack, TRUE, 6); if (ch->fighting != victim) return; } chance = get_skill (ch, gsn_sixth_attack) / 2; if (IS_AFFECTED (ch, AFF_SLOW)) chance = 0; if (number_percent () < chance) { dam = number_range (1, ch->level); damage (ch, victim, number_range (dam, (ch->level * 1.5)), gsn_kick, DAM_BASH, TRUE, 0); check_improve (ch, gsn_sixth_attack, TRUE, 6); if (ch->fighting != victim) return; } return; } /* Class-Specific Enhanced Damage by Fesdor. Date: Late '08 (yeah it rhymes) */ static int edam_bonus( CHAR_DATA *ch, int damage ) { //Overriding values in case the class's code does not modify them. int min=5; int max=30; int bonus=1; char buf[MSL/4]; int cclass = ch->class; switch (cclass) { case CLASS_WARRIOR: case CLASS_GLADIATOR: { min = 5; max = 60; break; } case CLASS_SWASHBUCKLER: { //All Warriors must be berserking. if (IS_AFFECTED (ch, AFF_BERSERK)) { //Swashbuckler enhanced cares about hitroll. min = 2; max = 15; min += (min*GET_HITROLL(ch))/250; max += (max*GET_HITROLL(ch))/250;//max=34 with 250 hr break; } else { min = 3; max = 15; break; } } case CLASS_CRUSADER: { //All Warriors must be berserking. if (IS_AFFECTED (ch, AFF_BERSERK)) { //Crusader enhanced cares about align if (ch->alignment <= 0) { min = 5; max = 20; max += (max*ch->alignment)/1000; } else if (ch->alignment != 1000) { min = 10; max = 15; max += (max*ch->alignment)/1000;//lim(max) as align->1000 = 30 } else { min = 10; max = 35;//Small bonus for having true 1000 align (pure good) } break; } else { min = 3; max = 15; break; } } case CLASS_HIGHLANDER: { //All Warriors must be berserking. if (IS_AFFECTED (ch, AFF_BERSERK)) { //Highlander enhanced cares about power level. min = 5; max = 22; if (ch->pcdata->power[POWER_LEVEL] >= 3) { max += (max*ch->pcdata->power[POWER_LEVEL])/3;//max=66 at plevel 6. } else { min = 5; max = 30;//Let's not cripple the newbies } break; } else { min = 3; max = 15; break; } } case CLASS_RANGER: case CLASS_STRIDER: { min = 5; max = 50; break; } case CLASS_DARKPALADIN: { //Darkpaladin cares about black magic rating and align (only if not evil). min = 5; max = 15; max += (max*ch->magic[MAGIC_BLACK])/100;//max=45 for 200 black if (ch->alignment > 0) { max -= (max*ch->alignment)/1000; } break; } case CLASS_HUNTER: { //Nice bonus if in forest, decent bonus if in any other "outdoor" sector. if(ch->in_room->sector_type == SECT_CITY || ch->in_room->sector_type == SECT_INSIDE) { min = 5; max = 25; } else if (ch->in_room->sector_type != SECT_FOREST) { min = 5; max = 50; } else { min = 10; max = 75; } break; } case CLASS_PALADIN: { //Paladin cares about white magic rating and align (only if not good). //Straight copy of darkpaladin with proper switches made. min = 5; max = 15; max += (max*ch->magic[MAGIC_WHITE])/100; if (ch->alignment < 0) { max += (max*ch->alignment)/1000; } break; } case CLASS_THIEF: case CLASS_MERCENARY: min = 5; max = 30; break; case CLASS_ASSASSIN: { min = 5; max = 15; if (IS_AFFECTED(ch,AFF_SNEAK)) { max += (max*get_skill(ch,gsn_sneak))/50; //45 at 100% } break; } case CLASS_NINJA: { break; } case CLASS_BARD: { break; } case CLASS_SHADE: case CLASS_LICH: min = 5; max = 35; break; case CLASS_FADE: { if ( IS_SET(ch->ability_lich, ABILITY_LICH_NIGHTSTALKER) && (vam_str[time_info.hour] != 0 )) { //Daytime if ((time_info.hour > 6) && (time_info.hour < 18)) { min = 5; max = 15; } //Hours 18-23, no fixing needed else if ((time_info.hour >= 18) && (time_info.hour <= 23)) { min = 5; min += ((min * vam_str[time_info.hour]) / 12); max = 30; max += ((max * vam_str[time_info.hour]) / 12); } //Hours 1-6, flip them. else if ((time_info.hour >= 1) && (time_info.hour <= 6)) { min = 5; min += ((min * (24 - vam_str[time_info.hour])) / 12); max = 30; max += ((max * (24 - vam_str[time_info.hour])) / 12); } } //If not in nightstalker mode, flat rate. else if (!IS_SET(ch->ability_lich, ABILITY_LICH_NIGHTSTALKER)) { min = 5; max = 25; } //The Witching Hour: 0 else if (vam_str[time_info.hour] == 0) { min = 15;//The maximum minimum\maximum. Say that 10 times fast. max = 90; } break; } case CLASS_NECROMANCER: { break; } case CLASS_BANSHEE: { //See Fade above for structure comments. if ( IS_SET(ch->ability_lich, ABILITY_LICH_NIGHTSTALKER) && (vam_str[time_info.hour] != 0 )) { if ((time_info.hour > 6) && (time_info.hour < 18)) { min = 5; max = 15; } else if ((time_info.hour >= 18) && (time_info.hour <= 23)) { min = 5; min += ((min * get_age(ch)) / 300);//Small age factor min += ((min * vam_str[time_info.hour]) / 18); max = 25; min += ((min * get_age(ch)) / 300); max += ((max * vam_str[time_info.hour]) / 18); } else if ((time_info.hour >= 1) && (time_info.hour <= 6)) { min = 5; min += ((min * get_age(ch)) / 300); min += ((min * (24 - vam_str[time_info.hour])) / 18); max = 25; min += ((min * get_age(ch)) / 300); max += ((max * (24 - vam_str[time_info.hour])) / 18); } } else if (!IS_SET(ch->ability_lich, ABILITY_LICH_NIGHTSTALKER)) { min = 5; max = 25; } else if (vam_str[time_info.hour] == 0) { //Gotta calculate them this time. min = 5; min += ((min * get_age(ch)) / 300); min *= 4/3; max = 25; min += ((min * get_age(ch)) / 300); max *= 4/3; } break; } case CLASS_CLERIC: case CLASS_PRIEST: min = 5; max = 30; break; case CLASS_VOODAN: { break; } case CLASS_MONK: { if (is_affected(ch,gsn_martial_arts)) { min = 3; max = 10; } else { min = 1; max = 2; } break; } case CLASS_SAINT: { break; } case CLASS_DRUID: case CLASS_SAGE: min = 5; max = 25; break; case CLASS_WARLOCK: //Based on saves. { min = 3; max = 15; min -= (min*ch->saving_throw)/50; //9 at -100 max -= (max*ch->saving_throw)/33; //60 at -100 break; } case CLASS_ALCHEMIST: { break; } case CLASS_SHAMAN: //Inversely proportional to hp { min = 10; max = 20; max += ((max*(ch->max_hit-ch->hit))/ch->max_hit)*2; //max is 50 at 20% hp. break; } case CLASS_MAGE: case CLASS_WIZARD: min = 5; max = 20; break; case CLASS_FORSAKEN: { //Bonus for a weapon with a magical damtype. int dt = 0; OBJ_DATA *wield; wield = get_eq_char(ch, WEAR_WIELD); if (wield != NULL && wield->item_type == ITEM_WEAPON) { dt += wield->value[3]; } else { dt += ch->dam_type; } //Super ghetto because table in const.c is badly organized. Make sure if you change the damtype table you change this check. if ((dt==14) || (18<=dt && dt<=20) || (28<=dt && dt<=31) || (dt==33) || (dt==35) || (dt==36) || (dt==38) || (dt==39) || (dt > 40)) { min = 10; max = (7*number_range(6,10)+10*number_range(1,7));//52 to 140, weighted to the high side } else { min = 5; max = 30; } break; } case CLASS_CONJURER: { break; } case CLASS_ARCHMAGE: { //Bonus if you have a weapon with a magical damtype, same as forsaken only slightly less varied bonus int dt = 0; OBJ_DATA *wield; wield = get_eq_char(ch, WEAR_WIELD); if (wield != NULL && wield->item_type == ITEM_WEAPON) { dt += wield->value[3]; } else { dt += ch->dam_type; } //Make sure if you change the damtype table in const.c you change this check and vise verse. if ((dt==14) || (18<=dt && dt<=20) || (28<=dt && dt<=31) || (dt==33) || (dt==35) || (dt==36) || (dt==38) || (dt==39) || (dt > 40)) { min = 8; max = (7*number_range(8,10)+10*number_range(1,4));//66 to 110, weighted high } else { min = 5; max = 30; } break; } default: min = 5; max = 15; break; } bonus = min + (rand()%(max-min)); if (ch->level > 101) { sprintf(buf,"{REnhanced Damage: {Wmin:%d {Ymax:%d {Cbonus:%d {Mreturn:%d{x\n\r",min,max,bonus,damage*bonus/90); send_to_char(buf,ch); } return ((damage*bonus)/90); } void update_power(CHAR_DATA *highlander) { if(highlander->pcdata->power[POWER_POINTS] <= 1250) highlander->pcdata->power[POWER_LEVEL] = 1; else if(highlander->pcdata->power[POWER_POINTS] <= 3000) highlander->pcdata->power[POWER_LEVEL] = 2; else if(highlander->pcdata->power[POWER_POINTS] <= 8500) highlander->pcdata->power[POWER_LEVEL] = 3; else if(highlander->pcdata->power[POWER_POINTS] <= 17500) highlander->pcdata->power[POWER_LEVEL] = 4; else if(highlander->pcdata->power[POWER_POINTS] <= 35000) highlander->pcdata->power[POWER_LEVEL] = 5; else if(highlander->pcdata->power[POWER_POINTS] > 35000) highlander->pcdata->power[POWER_LEVEL] = 6; return; } void falcon_load(CHAR_DATA *ch, CHAR_DATA *victim) { CHAR_DATA *falcon; falcon = create_mobile( get_mob_index(MOB_VNUM_FALCON) ); falcon->alignment = ch->alignment; falcon->level = ch->level; falcon->hitroll = (ch->level); falcon->max_hit = (ch->max_hit * 2)/3; falcon->hit = (ch->max_hit/2); falcon->damroll = (ch->level); falcon->damage[DICE_NUMBER] = (ch->level/5)+1; falcon->damage[DICE_TYPE] = dice(6,6); SET_BIT(falcon->res_flags, RES_WEAPON); SET_BIT (falcon->act, ACT_PET); SET_BIT (falcon->affected_by, AFF_CHARM); falcon->comm = COMM_NOTELL | COMM_NOSHOUT | COMM_NOCHANNELS; add_follower (falcon, ch); falcon->leader = ch; ch->pet = falcon; char_to_room( falcon, ch->in_room ); act( "$N swoops down from the skies above to aid $n.", ch, NULL, falcon, TO_ROOM ); send_to_char("A large Battle Falcon swoops down from the skies above, coming to your aid.\n\r",ch); return; } /* * Part Creator....for lack of one. -- Skyntil */ void part_create(CHAR_DATA *ch, char *argument) { char arg [MAX_INPUT_LENGTH]; int vnum; argument = one_argument(argument,arg); vnum = 0; if(IS_SET(ch->act,ACT_NO_BODY)) return; if (arg[0] == '\0') 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,"guts")) vnum = OBJ_VNUM_GUTS; else if (!str_cmp(arg,"brain")) vnum = OBJ_VNUM_BRAINS; else if (!str_cmp(arg,"blood")) vnum = OBJ_VNUM_BLOOD; else if (!str_cmp(arg,"eye")) vnum = OBJ_VNUM_EYEBALL; // no body parts in arena if(!IS_NPC(ch)) { if (IS_SET(ch->in_room->room_flags,ROOM_ARENA)) vnum = OBJ_VNUM_BLOOD; } 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(4,7); else obj->timer = number_range(12,18); if (vnum == OBJ_VNUM_BLOOD) obj->timer = number_range(1,4); 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 ); sprintf( buf, obj->name, name ); free_string( obj->name ); obj->name = str_dup( buf ); if (IS_NPC (ch)) { obj->value[4] = 0; } else { obj->value[4] = 1; } obj_to_room( obj, ch->in_room ); } return; } void do_sskill (CHAR_DATA * ch, char *argument) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; one_argument (argument, arg); if (IS_NPC (ch)) return; if (arg[0] == '\0') sprintf (arg, ch->name); 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 NPC's.\n\r", ch); return; } skillstance (ch, victim); return; } void skillstance (CHAR_DATA * ch, CHAR_DATA * victim) { char buf[MAX_INPUT_LENGTH]; char bufskill[25]; char stancename[10]; int stance; if (IS_NPC (victim)) return; stance = victim->stance[0]; if (stance < 1 || stance > 10) { send_to_char ("You aren't in a stance!\n\r", ch); return; } if (victim->stance[stance] <= 0) sprintf (bufskill, "completely unskilled in"); else if (victim->stance[stance] <= 25) sprintf (bufskill, "an apprentice of"); else if (victim->stance[stance] <= 50) sprintf (bufskill, "a trainee of"); else if (victim->stance[stance] <= 75) sprintf (bufskill, "a student of"); else if (victim->stance[stance] <= 100) sprintf (bufskill, "fairly experienced in"); else if (victim->stance[stance] <= 125) sprintf (bufskill, "well trained in"); else if (victim->stance[stance] <= 150) sprintf (bufskill, "highly skilled in"); else if (victim->stance[stance] <= 175) sprintf (bufskill, "an expert of"); else if (victim->stance[stance] <= 199) sprintf (bufskill, "a master of"); else if (victim->stance[stance] >= 200) sprintf (bufskill, "a grand master of"); else { send_to_char ("You aren't in a stance!\n\r", ch); return; } if (stance == STANCE_VIPER) sprintf (stancename, "viper"); else if (stance == STANCE_CRANE) sprintf (stancename, "crane"); else if (stance == STANCE_CRAB) sprintf (stancename, "crab"); else if (stance == STANCE_MONGOOSE) sprintf (stancename, "mongoose"); else if (stance == STANCE_BULL) sprintf (stancename, "bull"); else if (stance == STANCE_MANTIS) sprintf (stancename, "mantis"); else if (stance == STANCE_DRAGON) sprintf (stancename, "dragon"); else if (stance == STANCE_TIGER) sprintf (stancename, "tiger"); else if (stance == STANCE_MONKEY) sprintf (stancename, "monkey"); else if (stance == STANCE_SWALLOW) sprintf (stancename, "swallow"); else return; if (ch == victim) sprintf (buf, "You are %s the %s stance.", bufskill, stancename); else sprintf (buf, "$N is %s the %s stance.", bufskill, stancename); act (buf, ch, NULL, victim, TO_CHAR); return; } int dambonus (CHAR_DATA * ch, CHAR_DATA * victim, int dam, int stance) { if (dam < 1) return 0; if (stance < 1 || stance > 10) return dam; if (dam > 10000) return 10000; return dam; } bool can_counter (CHAR_DATA * ch) { if (IS_NPC (ch)) return FALSE; if(IS_SET(ch->stance_aff,STANCE_AFF_COUNTER) && number_percent() < ch->stance[ch->stance[0]] * 0.5) return TRUE; return FALSE; } bool can_bypass (CHAR_DATA * ch, CHAR_DATA * victim) { if (IS_NPC (ch) || IS_NPC (victim)) return FALSE; if(IS_SET(ch->stance_aff,STANCE_AFF_BYPASS) && number_percent() < ch->stance[ch->stance[0]] / 2) return TRUE; return FALSE; } void improve_stance (CHAR_DATA * ch) { char buf[MAX_INPUT_LENGTH]; char bufskill[25]; char stancename[10]; int dice1; int dice2; int dice3; int stance; dice1 = number_percent (); dice2 = number_percent (); dice3 = number_percent (); if (IS_NPC (ch)) return; stance = ch->stance[0]; if (stance < 1 || stance > 10) return; if (ch->stance[stance] >= 200) { ch->stance[stance] = 200; return; } if ( ch->stance[stance] < 100 ) { if (((dice1 > ch->stance[stance] && dice2 > ch->stance[stance]) || (dice1 >= 94 || dice2 >= 94)) && dice3 > 50) ch->stance[stance] += 1; else return; } else { if (((dice1 > ch->stance[stance] && dice2 > ch->stance[stance]) || (dice1 >= 99 || dice2 >= 99)) && dice3 > 60) ch->stance[stance] += 1; else return; } if (stance == ch->stance[stance]) return; if (ch->stance[stance] == 1) sprintf (bufskill, "an apprentice of"); else if (ch->stance[stance] == 26) sprintf (bufskill, "a trainee of"); else if (ch->stance[stance] == 51) sprintf (bufskill, "a student of"); else if (ch->stance[stance] == 76) sprintf (bufskill, "fairly experienced in"); else if (ch->stance[stance] == 101) sprintf (bufskill, "well trained in"); else if (ch->stance[stance] == 126) sprintf (bufskill, "highly skilled in"); else if (ch->stance[stance] == 151) sprintf (bufskill, "an expert of"); else if (ch->stance[stance] == 176) sprintf (bufskill, "a master of"); else if (ch->stance[stance] == 200) sprintf (bufskill, "a grand master of"); else return; if (stance == STANCE_VIPER) sprintf (stancename, "viper"); else if (stance == STANCE_CRANE) sprintf (stancename, "crane"); else if (stance == STANCE_CRAB) sprintf (stancename, "crab"); else if (stance == STANCE_MONGOOSE) sprintf (stancename, "mongoose"); else if (stance == STANCE_BULL) sprintf (stancename, "bull"); else if (stance == STANCE_MANTIS) sprintf (stancename, "mantis"); else if (stance == STANCE_DRAGON) sprintf (stancename, "dragon"); else if (stance == STANCE_TIGER) sprintf (stancename, "tiger"); else if (stance == STANCE_MONKEY) sprintf (stancename, "monkey"); else if (stance == STANCE_SWALLOW) sprintf (stancename, "swallow"); else return; sprintf (buf, "You are now %s the %s stance.\n\r", bufskill, stancename); send_to_char (buf, ch); return; } void do_stance (CHAR_DATA * ch, char *argument) { char arg[MAX_INPUT_LENGTH]; int selection; argument = one_argument (argument, arg); if (IS_NPC (ch)) return; if (arg[0] == '\0') { if (ch->stance[0] == -1) { ch->stance[0] = 0; send_to_char ("You drop into a fighting stance.\n\r", ch); act ("$n drops into a fighting stance.", ch, NULL, NULL, TO_ROOM); } else { ch->stance[0] = -1; send_to_char ("You relax from your fighting stance.\n\r", ch); act ("$n relaxes from $s fighting stance.", ch, NULL, NULL, TO_ROOM); } return; } if (ch->stance[0] > 0) { send_to_char ("You cannot change stances until you come up from the one you are currently in.\n\r", ch); return; } if (!str_cmp (arg, "none")) { selection = STANCE_NONE; send_to_char ("You drop into a general fighting stance.\n\r", ch); act ("$n drops into a general fighting stance.", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); } else if (!str_cmp (arg, "viper")) { selection = STANCE_VIPER; send_to_char ("You arch your body into the viper fighting stance.\n\r", ch); act ("$n arches $s body into the viper fighting stance.", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_SPEED); SET_BIT(ch->stance_aff,STANCE_AFF_BYPASS); if(IS_SET(ch->plyr,PLAYER_THIEF)) SET_BIT(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED); } else if (!str_cmp (arg, "crane")) { selection = STANCE_CRANE; send_to_char ("You swing your body into the crane fighting stance.\n\r", ch); act ("$n swings $s body into the crane fighting stance.", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_IMPROVED_BLOCK); SET_BIT(ch->stance_aff,STANCE_AFF_BLOCK); SET_BIT(ch->stance_aff,STANCE_AFF_COUNTER); } else if (!str_cmp (arg, "crab")) { selection = STANCE_CRAB; send_to_char ("You squat down into the crab fighting stance.\n\r", ch); act ("$n squats down into the crab fighting stance. ", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_ROLL); SET_BIT(ch->stance_aff,STANCE_AFF_IMPROVED_DEFENSE); } else if (!str_cmp (arg, "mongoose")) { selection = STANCE_MONGOOSE; send_to_char ("You twist into the mongoose fighting stance.\n\r", ch); act ("$n twists into the mongoose fighting stance. ", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_IMPROVED_DODGE); SET_BIT(ch->stance_aff,STANCE_AFF_ACROBATICS); } else if (!str_cmp (arg, "bull")) { selection = STANCE_BULL; send_to_char ("You hunch down into the bull fighting stance.\n\r", ch); act ("$n hunches down into the bull fighting stance. ", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_AGGRESSIVE); SET_BIT(ch->stance_aff,STANCE_AFF_COUNTER); if(IS_SET(ch->plyr,PLAYER_WARRIOR)) SET_BIT(ch->stance_aff,STANCE_AFF_DOUBLE_POWER); } else { if (!str_cmp (arg, "mantis") && ch->stance[STANCE_CRANE] >= 200 && ch->stance[STANCE_VIPER] >= 200) { selection = STANCE_MANTIS; send_to_char ("You spin your body into the mantis fighting stance.\n\r", ch); act ("$n spins $s body into the mantis fighting stance.", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_IMPROVED_BLOCK); SET_BIT(ch->stance_aff,STANCE_AFF_ENHANCED_BLOCK); SET_BIT(ch->stance_aff,STANCE_AFF_BLOCK); SET_BIT(ch->stance_aff,STANCE_AFF_SPEED); SET_BIT(ch->stance_aff,STANCE_AFF_BYPASS); if(IS_SET(ch->plyr,PLAYER_THIEF)) SET_BIT(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED); } else if (!str_cmp (arg, "dragon") && ch->stance[STANCE_BULL] >= 200 && ch->stance[STANCE_CRAB] >= 200) { selection = STANCE_DRAGON; send_to_char ("You coil your body into the dragon fighting stance.\n\r", ch); act ("$n coils $s body into the dragon fighting stance.", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_ROLL); SET_BIT(ch->stance_aff,STANCE_AFF_AGGRESSIVE); SET_BIT(ch->stance_aff,STANCE_AFF_COUNTER); SET_BIT(ch->stance_aff,STANCE_AFF_IMPROVED_DEFENSE); if(IS_SET(ch->plyr,PLAYER_WARRIOR)) SET_BIT(ch->stance_aff,STANCE_AFF_DOUBLE_POWER); } else if (!str_cmp (arg, "tiger") && ch->stance[STANCE_BULL] >= 200 && ch->stance[STANCE_VIPER] >= 200) { selection = STANCE_TIGER; send_to_char ("You lunge into the tiger fighting stance.\n\r", ch); act ("$n lunges into the tiger fighting stance.", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_AGGRESSIVE); SET_BIT(ch->stance_aff,STANCE_AFF_COUNTER); SET_BIT(ch->stance_aff,STANCE_AFF_BYPASS); SET_BIT(ch->stance_aff,STANCE_AFF_SPEED); if(IS_SET(ch->plyr,PLAYER_THIEF)) SET_BIT(ch->stance_aff,STANCE_AFF_DOUBLE_SPEED); if(IS_SET(ch->plyr,PLAYER_WARRIOR)) SET_BIT(ch->stance_aff,STANCE_AFF_DOUBLE_POWER); } else if (!str_cmp (arg, "monkey") && ch->stance[STANCE_CRANE] >= 200 && ch->stance[STANCE_MONGOOSE] >= 200) { selection = STANCE_MONKEY; send_to_char ("You rotate your body into the monkey fighting stance.\n\r", ch); act ("$n rotates $s body into the monkey fighting stance.", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_IMPROVED_BLOCK); SET_BIT(ch->stance_aff,STANCE_AFF_ENHANCED_BLOCK); SET_BIT(ch->stance_aff,STANCE_AFF_BLOCK); SET_BIT(ch->stance_aff,STANCE_AFF_IMPROVED_DODGE); SET_BIT(ch->stance_aff,STANCE_AFF_ACROBATICS); } else if (!str_cmp (arg, "swallow") && ch->stance[STANCE_CRAB] >= 200 && ch->stance[STANCE_MONGOOSE] >= 200) { selection = STANCE_SWALLOW; send_to_char ("You slide into the swallow fighting stance.\n\r", ch); act ("$n slides into the swallow fighting stance.", ch, NULL, NULL, TO_ROOM); clear_stance_affects(ch); SET_BIT(ch->stance_aff,STANCE_AFF_IMPROVED_DODGE); SET_BIT(ch->stance_aff,STANCE_AFF_ACROBATICS); SET_BIT(ch->stance_aff,STANCE_AFF_ROLL); SET_BIT(ch->stance_aff,STANCE_AFF_IMPROVED_DEFENSE); } else { send_to_char ("Syntax is: stance <style>.\n\r", ch); send_to_char ("Stance being one of: None, Viper, Crane, Crab, Mongoose, Bull.\n\r", ch); return; } } ch->stance[0] = selection; WAIT_STATE (ch, 16); return; } void clear_stance_affects(CHAR_DATA *ch) { ch->stance_aff = 0; } int add_damroll(CHAR_DATA *ch, int diceside) { int value = 0, damroll; damroll = GET_MOD_DAMROLL(ch); // More on this if(diceside == 1) { if(damroll > 10) value++; if(damroll > 25) value++; if(damroll > 40) value++; if(damroll > 70) value++; if(damroll > 100) value++; if(damroll > 150) value++; if(damroll > 200) value++; if(damroll > 300) value++; if(damroll > 400) value++; } // Less on this else if(diceside == 2) { if(damroll > 25) value++; if(damroll > 60) value++; if(damroll > 100) value++; if(damroll > 135) value++; if(damroll > 200) value++; if(damroll > 275) value++; if(damroll > 400) value++; } return value; } int check_martial_arts(CHAR_DATA *ch, CHAR_DATA *victim) { int roll; int bonus = 0; char buf1[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; char buf3[MAX_STRING_LENGTH]; if( (roll = number_percent()) < ((get_skill(ch,gsn_martial_arts)*3)/8) ) { switch(number_range(1,5)) { case (1): strcpy( buf1, "You smash your fist into $N's chest!" ); strcpy( buf2, "$n smashes $s fist into your chest!" ); strcpy( buf3, "$n smashes $s fist into $N's chest!" ); WAIT_STATE(victim, 4); bonus = 9; break; case (2): strcpy( buf1, "You duck below $N's attack and deliver a chop to $N's shins!" ); strcpy( buf2, "$n ducks below your attack and delivers a chop to your shins!" ); strcpy( buf3, "$n ducks below $N's attack and delivers a chop to $N's shins!" ); bonus = 11; break; case (3): strcpy( buf1, "You viciously strike $N's shoulder-blade!" ); strcpy( buf2, "$n viciously strikes your shoulder-blade!" ); strcpy( buf3, "$n viciously strikes $N's shoulder-blade!" ); bonus = 9; break; case (4): strcpy( buf1, "You reverse-kick $N in the side!" ); strcpy( buf2, "$n reverse-kicks you in the side!" ); strcpy( buf3, "$n reverse-kicks $N in the side!" ); bonus = 20; WAIT_STATE(victim, 6); break; case (5): strcpy( buf1, "You send a swift kick at $N's knees!" ); strcpy( buf2, "$n sends a swift kick at your knees!" ); strcpy( buf3, "$n sends a swift kick at $N's knees!" ); bonus = 12; break; } act(buf1,ch,0,victim,TO_CHAR); act(buf2,ch,0,victim,TO_VICT); act(buf3,ch,0,victim,TO_NOTVICT); check_improve(ch,gsn_martial_arts,TRUE,6); } else{ bonus = 0; check_improve(ch,gsn_martial_arts,FALSE,6); } if (bonus == 0) return 0; bonus = ch->level+dice(ch->level/4,bonus); return bonus; } bool check_open_palming(CHAR_DATA *ch) { int chance = 8; if (!is_affected(ch,gsn_palm)) return FALSE; if(ch->pcdata->power[1] >= 400) chance = 65; if (number_percent() > chance) return FALSE; return TRUE; } /* * Check for Block. */ bool check_block(CHAR_DATA * ch, CHAR_DATA * victim) { int chance = 0, dam = 0; if (!IS_AWAKE (victim)) return FALSE; if(IS_NPC(victim) || !IS_SET(victim->stance_aff,STANCE_AFF_BLOCK)) return FALSE; /* no block if blind */ if (IS_AFFECTED (victim, AFF_BLIND)) { int bfsucc; chance = get_skill( victim, gsn_blind_fighting ); chance = (chance * 3) / 5; chance += 25; bfsucc= ((number_percent() <= chance)); check_improve(victim, gsn_blind_fighting, bfsucc, 12); if (!bfsucc) return FALSE; } chance = get_skill (victim, gsn_hand_to_hand); if (!can_see (victim, ch)) chance /= 2; if(!IS_NPC(victim) && victim->class == CLASS_MONK && is_affected(victim,gsn_martial_arts)) { if(victim->pcdata->power[1] > number_percent()) chance *= 2; } /* STANCES */ if(IS_SET(victim->stance_aff,STANCE_AFF_IMPROVED_BLOCK) && number_percent() < victim->stance[victim->stance[0]] * 0.5) chance += 15; if(IS_SET(victim->stance_aff,STANCE_AFF_ENHANCED_BLOCK) && number_percent() < victim->stance[victim->stance[0]] * 0.5) chance += 15; chance -= (GET_HITROLL (ch) * 0.2); if (number_percent () >= chance + (victim->level - ch->level)/2) return FALSE; if (victim->stunned) return FALSE; // Stance Counter if(can_counter(ch)) { if(number_percent() < 15) { dam = number_range( 20, (ch->level*3) ); act( "$n counters your block!", ch, NULL, victim, TO_VICT); act( "You counter $N's block and strike $N.", ch, NULL, victim, TO_CHAR); act( "$n counters $N's block.", ch, NULL, victim, TO_NOTVICT); damage(ch,victim,number_range( dam,(ch->level*5) ),gsn_parry,DAM_SLASH,TRUE,0); return FALSE; } } if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You block $n's attack!{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N blocks your attack!{x", ch, NULL, victim, TO_CHAR); return TRUE; } /* * Check for Acrobatics. */ bool check_acrobatics(CHAR_DATA * ch, CHAR_DATA * victim) { int chance = 0, dam = 0; if (!IS_AWAKE (victim)) return FALSE; if(IS_NPC(victim) || !IS_SET(victim->stance_aff,STANCE_AFF_ACROBATICS)) return FALSE; if (IS_AFFECTED (victim, AFF_BLIND)) { int bfsucc; chance = get_skill( victim, gsn_blind_fighting ); chance = (chance * 3) / 5; chance += 25; bfsucc= ((number_percent() <= chance)); check_improve(victim, gsn_blind_fighting, bfsucc, 12); if (!bfsucc) return FALSE; } if(number_percent() < (victim->stance[victim->stance[0]] * 0.5)) chance = 45; /* Increased to 45 because stance_aff was almost useless */ if (!can_see (victim, ch)) chance /= 2; if(!IS_NPC(victim) && victim->class == CLASS_MONK) { if(victim->pcdata->power[1] > number_percent()) chance *= 2; } chance -= (GET_HITROLL (ch) * 0.1); if (number_percent () >= chance + (victim->level - ch->level)/2) return FALSE; if (victim->stunned) return FALSE; if(can_bypass(ch,victim)) { if(number_percent() < 15) { dam = number_range( 20, (ch->level*3) ); act( "$n follows your flip!", ch, NULL, victim, TO_VICT); act( "You follow $N's flip and strike $M.", ch, NULL, victim, TO_CHAR); act( "$N follows $n's flip and strikes $M.", victim, NULL, ch, TO_NOTVICT); damage(ch,victim,number_range( dam,(ch->level*5) ),gsn_parry,DAM_SLASH,TRUE,0); return FALSE; } } if(number_range(1,2) == 1) { if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You flip away from $n's attack!{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N flips away from your attack!{x", ch, NULL, victim, TO_CHAR); } else { if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You leap away from $n's attack!{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N leaps away from your attack!{x", ch, NULL, victim, TO_CHAR); } return TRUE; } /* * Check for Roll. */ bool check_roll(CHAR_DATA * ch, CHAR_DATA * victim) { int chance = 0, dam = 0; if (!IS_AWAKE (victim)) return FALSE; if(IS_NPC(victim) || !IS_SET(victim->stance_aff,STANCE_AFF_ROLL)) return FALSE; if (IS_AFFECTED (victim, AFF_BLIND)) { int bfsucc; chance = get_skill( victim, gsn_blind_fighting ); chance = (chance * 3) / 5; chance += 25; bfsucc= ((number_percent() <= chance)); check_improve(victim, gsn_blind_fighting, bfsucc, 12); if (!bfsucc) return FALSE; } if(number_percent() < victim->stance[victim->stance[0]] * 0.5) chance = 45; /* Increased due to uselessness */ if (!can_see (victim, ch)) chance /= 2; if(!IS_NPC(victim) && victim->class == CLASS_MONK) { if(victim->pcdata->power[1] > number_percent()) chance *= 2; } chance -= (GET_HITROLL (ch) * 0.1); /* Added back in */ if (number_percent () >= chance + (victim->level - ch->level)/2) return FALSE; if (victim->stunned) return FALSE; // Stance Counter if(can_counter(ch)) { if(number_percent() < 15) { dam = number_range( 20, (ch->level*3) ); act( "$n counters your roll!", ch, NULL, victim, TO_VICT); act( "You counter $N's roll and strike $N.", ch, NULL, victim, TO_CHAR); act( "$n counters $N's roll.", ch, NULL, victim, TO_NOTVICT); damage(ch,victim,number_range( dam,(ch->level*5) ),gsn_parry,DAM_SLASH,TRUE,0); return FALSE; } } if(!IS_SET(victim->act,PLR_SHORT_COMBAT)) act ("{)You roll $n's attack off to the side!{x", ch, NULL, victim, TO_VICT); if(!IS_SET(ch->act,PLR_SHORT_COMBAT)) act ("{.$N rolls your attack away from $M!{x", ch, NULL, victim, TO_CHAR); return TRUE; } void improve_toughness (CHAR_DATA * ch) { char buf[MAX_INPUT_LENGTH]; char bufskill[25]; int dice1,dice3; int dice2,dice4; dice1 = number_percent (); dice2 = number_percent (); dice3 = number_percent (); dice4 = number_percent (); if (IS_NPC (ch)) return; if (ch->toughness >= 500) { ch->toughness = 500; return; } if (((dice1 > ch->toughness && dice2 > ch->toughness) || (dice3 > ch->toughness && dice4 > ch->toughness)) || ((dice1 == 100 || dice2 == 100) || (dice3 == 100 || dice4 == 100))) ch->toughness += 1; else return; if (ch->toughness == 1) sprintf (bufskill, "You feel your skin tingling."); else if (ch->toughness == 51) sprintf (bufskill, "Your skin feels tougher."); else if (ch->toughness == 101) sprintf (bufskill, "Your skin begins to harden."); else if (ch->toughness == 151) sprintf (bufskill, "Your flesh fuses tighter."); else if (ch->toughness == 200) sprintf (bufskill, "You feel more damage resistant."); else if (ch->toughness == 300) sprintf (bufskill, "Your skin turns to steel."); else if (ch->toughness == 400) sprintf (bufskill, "Your muscles feel like iron."); else if (ch->toughness == 500) sprintf (bufskill, "You develop steel nerves."); else return; sprintf (buf, "\n\r%s\n\r", bufskill); send_to_char (buf, ch); return; } bool check_deflect(CHAR_DATA *ch, CHAR_DATA *victim, int dt,int dam) { int chance; char buf1[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; /* char *attack;*/ int vict_dex; int ch_dex; if(dt < 1000 || dam <= 0) { sprintf(buf1,"DT: %d",dt); wiznet(buf1,NULL,NULL,WIZ_DEBUG,0,0); return FALSE; } if( dt == gsn_backstab || dt == gsn_ambush || dt == gsn_circle || dt == gsn_lunge || dt == gsn_bash || dt == gsn_adamantium_palm) return FALSE; //Wiznet test //wiznet("Deflect Calc",NULL,NULL,WIZ_DEBUG,0,0); chance = ( get_skill(victim,gsn_deflect) / 8); if(chance == 0) return FALSE; if (!can_see(victim,ch)) chance /= 2; // Better check here, dex & level range vict_dex = get_curr_stat(victim, STAT_DEX); ch_dex = get_curr_stat(ch, STAT_DEX); if(!IS_NPC(ch)) chance -= (ch_dex - vict_dex); else chance -= ( (ch_dex*3/4) - vict_dex); if(ch->level > victim->level+10) chance -= 10; else if(ch->level > victim->level) chance -= 5; else if((ch->level + 10) < victim->level) chance += 4; else if( ch->level < victim->level) chance += 8; if (chance > 25) chance = 25; if ( number_percent( ) > chance ) { check_improve(victim,gsn_deflect,FALSE,4); return FALSE; } wiznet("Deflect Success",NULL,NULL,WIZ_DEBUG,0,0); //attack = dt_name(dt); sprintf(buf2,"You turn $n's %s back on him!","attack"); sprintf(buf1,"$N turns your %s back on you!","attack"); act(buf2,ch,NULL,victim,TO_VICT); if(!IS_NPC(ch)) act(buf1,ch,NULL,victim,TO_CHAR); check_improve(victim,gsn_deflect,TRUE,5); damage(victim,ch,dam,gsn_deflect,DAM_BASH,TRUE, 0); return TRUE; } bool check_counter_defense(CHAR_DATA *ch,CHAR_DATA *victim,int dt) { int chance; if ((chance = get_skill(ch,gsn_counter_defense)) == 0 || IS_NPC(ch) || ch->level < skill_table[gsn_counter_defense].skill_level[ch->class]) return FALSE; chance /= (ch->level/15); if (chance > 20) chance = 20; if(dt == gsn_dodge) chance += 5; if (number_percent() < chance) { check_improve(ch,gsn_counter_defense,TRUE,3); return TRUE; } check_improve(ch,gsn_counter_defense,FALSE,2); return FALSE; } /*************************************************************************** * PK/Arena Ranking Code - Written Exclusively for Asgardian Nightmare Mud * * by Chris Langlois. tas@intrepid.inetsolve.com * * Ranking system is a modification of Professor Arpad Elo's ranking * * which is also commonly used by FIDE - The International Chess * * Federation. More info on the specifics of the system can be found at * * http://www.vogclub.com/ratings/elodetails.phtml * ***************************************************************************/ int rank_pk (CHAR_DATA * ch, CHAR_DATA * victim) { double mod = 0; double bias = 0; double buffer = 0; if (IS_NPC(ch) || IS_NPC(victim)) { return 0; } /* Mod = 1/(1+10^((vrank-chrank)/200)) */ mod = (victim->pcdata->prank - ch->pcdata->prank)/200; mod = pow(10,mod); mod = (1/(1+mod)); /* Bias = 25 + (15*(vtier - chtier)) + (2*(vlvl - plvl)) */ bias = victim->pcdata->tier - ch->pcdata->tier; bias *= 15; bias = 25 + bias + (2*(victim->level - ch->level)); /* Rn = Ro + Bias( W - Mod ) */ if(ch->class == CLASS_HIGHLANDER && is_pkill(ch)) { ch->pcdata->power[POWER_POINTS] = ((ch->pcdata->prank-1500)*100)+5000; update_power(ch); } if(victim->class == CLASS_HIGHLANDER && is_pkill(victim)) { victim->pcdata->power[POWER_POINTS] = ((victim->pcdata->prank-1500)*100)+5000; update_power(victim); } buffer = (bias * ( 1 - mod ) ); return UMAX(buffer, 0); } int chance_pk (CHAR_DATA * ch, CHAR_DATA * victim) { double mod = 0; if (IS_NPC(ch) || IS_NPC(victim)) { return 0; } /* Mod = 1/(1+10^((vrank-chrank)/200)) */ mod = (victim->pcdata->prank - ch->pcdata->prank); mod /= 200; mod = pow(10,mod); mod = (1/(1+mod)); mod *= 100; return ( mod ); } int rank_arena (CHAR_DATA * ch, CHAR_DATA * victim) { double mod = 0; double bias = 0; double buffer = 0; if (IS_NPC(ch) || IS_NPC(victim)) { return 0; } /* Mod = 1/(1+10^((vrank-chrank)/200)) */ mod = (victim->pcdata->arank - ch->pcdata->arank)/200; mod = pow(10,mod); mod = (1/(1+mod)); /* Bias = 25 + (15*(vtier - chtier)) + (2*(vlvl - plvl)) */ bias = victim->pcdata->tier - ch->pcdata->tier; bias *= 15; bias = 25 + bias + (2*(victim->level - ch->level)); /* Rn = Ro + Bias( W - Mod ) */ if(ch->class == CLASS_HIGHLANDER && !is_pkill(ch)) { ch->pcdata->power[POWER_POINTS] = ((ch->pcdata->arank-1500)*100)+5000; update_power(ch); } if(victim->class == CLASS_HIGHLANDER && !is_pkill(victim)) { victim->pcdata->power[POWER_POINTS] = ((victim->pcdata->arank-1500)*100)+5000; update_power(victim); } buffer = (bias * ( 1 - mod ) ); return UMAX(buffer, 0); } int chance_arena (CHAR_DATA * ch, CHAR_DATA * victim) { double mod = 0; if (IS_NPC(ch) || IS_NPC(victim)) { return 0; } /* Mod = 1/(1+10^((vrank-chrank)/200)) */ mod = (victim->pcdata->arank - ch->pcdata->arank); mod /= 200; mod = pow(10,mod); mod = (1/(1+mod)); mod *= 100; return ( mod ); } void do_rank (CHAR_DATA * ch, char *argument) { char arg1 [MIL]; char arg2 [MIL]; char buf [MSL]; smash_tilde( argument ); argument = one_argument(argument, arg1); strcpy(arg2, argument); if (!strcmp(arg1, "arena")) { if (!strcmp(arg2, "list")) { } else { DESCRIPTOR_DATA *d; bool found = FALSE; for (d = descriptor_list; d != NULL; d = d->next) { CHAR_DATA *wch; int winmod = 0; int losemod = 0; int pchance = 0; if (d->connected != CON_PLAYING || !can_see (ch, d->character)) continue; wch = (d->original != NULL) ? d->original : d->character; if (!can_see (ch, wch)) continue; if (IS_NPC (wch)) continue; if (!str_prefix (arg2, wch->name)) { found = TRUE; pchance = chance_arena(ch, wch); winmod = rank_arena(ch, wch); losemod = rank_arena(wch, ch); sprintf ( buf, "%s rank: %d. Your rank: %d.\n\r", wch->name, wch->pcdata->arank, ch->pcdata->arank); send_to_char(buf, ch); sprintf ( buf, "Your rank would become - Win: %d Loss: %d\n\r", (ch->pcdata->arank + winmod), (ch->pcdata->arank - losemod)); send_to_char(buf, ch); sprintf ( buf, "%s's rank would become - Win: %d Loss: %d\n\r", wch->name, (wch->pcdata->arank + losemod), (wch->pcdata->arank - winmod)); send_to_char(buf, ch); sprintf ( buf, "You have a %d%% chance of winning.\n\r", pchance); send_to_char(buf, ch); return; } } if (!found) { send_to_char("Syntax:\n\r", ch); send_to_char(" rank arena list\n\r", ch); send_to_char(" rank arena <name>\n\r", ch); send_to_char(" rank pk list\n\r", ch); send_to_char(" rank pk <name>\n\r", ch); send_to_char(" rank all list\n\r", ch); return; } } } else if (!strcmp(arg1, "pk")) { if (!strcmp(arg2, "list")) { } else { DESCRIPTOR_DATA *d; bool found = FALSE; for (d = descriptor_list; d != NULL; d = d->next) { CHAR_DATA *wch; int winmod = 0; int losemod = 0; int pchance = 0; if (d->connected != CON_PLAYING || !can_see (ch, d->character)) continue; wch = (d->original != NULL) ? d->original : d->character; if (!can_see (ch, wch)) continue; if (IS_NPC (wch)) continue; if (!str_prefix (arg2, wch->name)) { found = TRUE; pchance = chance_pk(ch, wch); winmod = rank_pk(ch, wch); losemod = rank_pk(wch, ch); sprintf ( buf, "%s rank: %d. Your rank: %d.\n\r", wch->name, wch->pcdata->prank, ch->pcdata->prank); send_to_char(buf, ch); sprintf ( buf, "Your rank would become - Win: %d Loss: %d\n\r", (ch->pcdata->prank + winmod), (ch->pcdata->prank - losemod)); send_to_char(buf, ch); sprintf ( buf, "%s's rank would become - Win: %d Loss: %d\n\r", wch->name, (wch->pcdata->prank + losemod), (wch->pcdata->prank - winmod)); send_to_char(buf, ch); sprintf ( buf, "You have a %d%% chance of winning.\n\r", pchance); send_to_char(buf, ch); return; } } if (!found) { send_to_char("Syntax:\n\r", ch); send_to_char(" rank arena list\n\r", ch); send_to_char(" rank arena <name>\n\r", ch); send_to_char(" rank pk list\n\r", ch); send_to_char(" rank pk <name>\n\r", ch); send_to_char(" rank all list\n\r", ch); return; } } } else if (!strcmp(arg1, "all")) { if (!strcmp(arg2, "list")) { return; } else { send_to_char("Syntax:\n\r",ch); send_to_char(" rank arena list\n\r", ch); send_to_char(" rank arena <name>\n\r", ch); send_to_char(" rank pk list\n\r", ch); send_to_char(" rank pk <name>\n\r", ch); send_to_char(" rank all list\n\r", ch); return; } } else { send_to_char("Syntax:\n\r", ch); send_to_char(" rank arena list\n\r", ch); send_to_char(" rank arena <name>\n\r", ch); send_to_char(" rank pk list\n\r", ch); send_to_char(" rank pk <name>\n\r", ch); send_to_char(" rank all list\n\r", ch); return; } } bool check_quick_step(CHAR_DATA *ch, CHAR_DATA *victim) { int chance; if (IS_NPC(ch)) return FALSE; if ( !IS_AWAKE(ch) ) return FALSE; if (ch->pcdata->learned[gsn_quick_step] < 1 || !has_skill(ch,gsn_quick_step)) return FALSE; if (!is_affected(ch,gsn_martial_arts)) return FALSE; chance = ( get_skill(ch,gsn_quick_step) / 10); chance += ( ch->level / 10); chance -= chance / 3; if ( number_percent( ) > chance ) { check_improve(ch,gsn_quick_step,FALSE,4); return FALSE; } act("$n begins to move around you very quickly.",ch,0,victim,TO_VICT); act("You start to move around $N with very quick steps.",ch,0,victim,TO_CHAR); act("$n begins to move around $N very quickly.",ch,0,victim,TO_NOTVICT); check_improve(ch,gsn_quick_step,TRUE,5); return TRUE; }