/*************************************************************************** * 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. * ***************************************************************************/ #include <glib.h> #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <merc.h> #include <tables.h> #include <interp.h> #include <fight.h> extern void set_fighting args( ( CHAR_DATA *ch, CHAR_DATA *victim ) ); /* * Control the fights going on. * Called periodically by update_handler. */ void violence_update( void ) { CHAR_DATA *ch; CHAR_DATA *ch_next; CHAR_DATA *victim; CHAR_DATA *rch; CHAR_DATA *rch_next; CHAR_DATA *mount; // OBJ_DATA *to_obj; for ( ch = char_list; ch != NULL; ch = ch_next ) { ch_next = ch->next; if ( ( victim = ch->fighting ) == NULL || ch->in_room == NULL ) continue; if ( ch->in_room != NULL && IS_RAFFECTED(ch->in_room,ROOM_AFF_REINA)) { stop_fighting(ch,TRUE); continue; } if ( check_safe_imm(ch) ) { stop_fighting(ch,TRUE); continue; } if (check_pk(ch,victim,CHECK_DELAY)) { stop_fighting(ch,TRUE); continue; } if (!IS_NPC(ch) && IS_ADDED(ch,ADDED_FRENZY) && ch->pcdata->frenzy_action == FRENZY_FLIGHT) do_flee(ch,""); if ( IS_AWAKE(ch) && IS_AWAKE(victim) && ch->in_room == victim->in_room ) { /* calls from here, because everyone actively fighting * (as in, not asleep and in the room, see "if" check above) * could pull a person into the fight, either against them * or against the oponent. Also called before a person hits * so that no one gets drawn in after a fight ends due to death. */ /*crowd_brawl(ch);*/ multi_hit( ch, victim, TYPE_UNDEFINED ); } else { //stop_fighting( ch, FALSE ); continue; } if ( ( victim = ch->fighting ) == NULL ) continue; /* * Fun for the whole family! */ for ( rch = ch->in_room->people; rch != NULL; rch = rch_next ) { rch_next = rch->next_in_room; if ( IS_AWAKE(rch) && rch->fighting == NULL ) { if (HAS_DELAY(rch)) continue; if ( IS_NPC(rch) && IS_SET(rch->act,ACT_GUARD) && rch->fighting == NULL) { /*KILL THE INFDELS!*/ if (IS_NPC(ch) && !IS_NPC(victim) && !IS_SET(ch->act,ACT_ANIMAL)) { set_fighting(rch,victim); do_say(rch,"Don't worry! We will protect you!"); multi_hit( rch, victim, TYPE_UNDEFINED ); continue; } if (IS_NPC(victim) && !IS_NPC(ch) && !IS_SET(ch->act,ACT_ANIMAL)) { set_fighting(rch,ch); do_say(rch,"Don't worry! We will protect you!"); multi_hit( rch, ch, TYPE_UNDEFINED ); continue; } } /* * Mount's auto-assist their riders and vice versa. */ if ( (mount = rch->mount) != NULL ) { if (mount == ch) multi_hit( rch, victim, TYPE_UNDEFINED ); continue; } /* * PC's auto-assist others in their group. */ if ( !IS_NPC(ch) || IS_AFFECTED(ch, AFF_CHARM) ) { if ( ( !IS_NPC(rch) || IS_AFFECTED(rch, AFF_CHARM) ) && is_same_group(ch, rch) ) multi_hit( rch, victim, TYPE_UNDEFINED ); continue; } /* * NPC's assist NPC's of same type or 12.5% chance regardless. */ if ( IS_NPC(rch) && !IS_AFFECTED(rch, AFF_CHARM) ) { if ( rch->pIndexData == ch->pIndexData || number_bits( 3 ) == 0 ) { CHAR_DATA *vch; CHAR_DATA *target = NULL; int number = 0; for ( vch = ch->in_room->people; vch; vch = vch->next ) { if ( can_see( rch, vch ) && is_same_group( vch, victim ) && number_range( 0, number ) == 0 ) { target = vch; number++; } } if ( target != NULL ) multi_hit( rch, target, TYPE_UNDEFINED ); } } } } 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 ); } if ( HAS_PROG(ch->in_room, TRIG_FIGHT) ) rprog_percent_trigger(ch->in_room, ch, NULL, NULL, TRIG_FIGHT); /* for ( to_obj = ch->in_room->contents; to_obj != NULL; to_obj = to_obj->next_content ) { if ( HAS_PROG(to_obj->pIndexData, TRIG_FIGHT) ) oprog_percent_trigger(to_obj, ch, NULL, NULL, TRIG_FIGHT); } */ } mudsetting->last_proc_logged = 43; return; }