/*
* The unique portions of SunderMud code as well as the integration efforts
* for code from other sources is based on the efforts of:
*
* Lotherius (elfren@aros.net)
*
* This code can only be used under the terms of the DikuMud, Merc,
* and ROM licenses. The same requirements apply to the changes that
* have been made.
*
* All other copyrights remain in place and in force.
*/
/* this procedure controls all mobile spell casting */
#include "everything.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;}