/* this procedure controls all mobile spell casting */ #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 "magic.h" /* locals procedures */ CHAR_DATA *target_harm args( (CHAR_DATA *ch) ); CHAR_DATA *target_aid args( (CHAR_DATA *ch) ); bool is_friend args( (CHAR_DATA *ch, CHAR_DATA *victim) ); /* returns a target suitable for mayhem */ CHAR_DATA *target_harm(CHAR_DATA *ch) { CHAR_DATA *victim, *vch; int count; if (ch == NULL || ch->in_room == NULL) return NULL; count = 0; victim = NULL; for (vch = ch->in_room->people; vch != NULL; vch = vch->next_in_room) { if (vch->fighting == ch && can_see(ch,vch)) { if number_range(0,count) == 0) victim = vch; count++; } } return victim; } /* finds a friend to help */ CHAR_DATA *target_aid(CHAR_DATA *ch) { CHAR_DATA *friend, *fch; int count; if (ch == NULL || ch->in_room == NULL) return NULL; count = 0; victim = NULL; for (fch = ch->in_room->people; fch != NULL; fch = fch->next_in_room) { if (is_friend(ch,fch) && can_see(ch,vch)) { if (number_range(0,count) == 0) friend = fch; count++; } } return friend; } /* checks to see if a mobile is friendly with a char or NPC */ bool is_friend(CHAR_DATA *ch, CHAR_DATA *victim) { if (ch->fighting != NULL && is_same_group(victim,ch->fighting)) return FALSE; if (is_same_group(ch,victim)) return TRUE; /* check for assist_player */ if (IS_NPC(ch) && IS_SET(ch->off_flags,ASSIST_PLAYERS) && !IS_NPC(victim)) return TRUE; if (!IS_NPC(victim) || IS_NPC(ch)) return FALSE; /* all cases below are NPC/NPC */ /* charmees are not friends */ if (IS_AFFECTED(ch,AFF_CHARM) || IS_AFFECTED(victim,AFF_CHARM)) return FALSE; if (IS_SET(ch->off_flags,ASSIST_ALL)) return TRUE; if (IS_SET(ch->off_flags,ASSIST_VNUM) && ch->pIndexData == victim->pIndexData) return TRUE; if (IS_SET(ch->off_flags,ASSIST_RACE) && ch->race == victim->race) return TRUE; if (IS_SET(ch->off_flags,ASSIST_ALIGN) && (( IS_GOOD(ch) && IS_GOOD(victim)) || ( IS_EVIL(ch) && IS_EVIL(victim)) || ( IS_NEUTRAL(ch) && IS_NEUTRAL(victim))) return TRUE; return FALSE; }