Ejemplo n.º 1
0
bool spec_cast_cleric( CHAR_DATA *ch )
{
    CHAR_DATA *victim;
    CHAR_DATA *v_next;
    char *spell;
    int sn;

    summon_if_hating( ch );

    if ( ch->position != POS_FIGHTING
       && ch->position !=  POS_EVASIVE
       && ch->position !=  POS_DEFENSIVE
       && ch->position !=  POS_AGGRESSIVE
       && ch->position !=  POS_BERSERK
    )
	return FALSE;

    for ( victim = ch->in_room->first_person; victim; victim = v_next )
    {
	v_next = victim->next_in_room;
	if ( who_fighting( victim ) == ch && number_bits( 2 ) == 0 )
	    break;
    }

    if ( !victim || victim == ch )
	return FALSE;

    for ( ;; )
    {
	int min_level;

	switch ( number_bits( 4 ) )
	{
	case  0: min_level =  0; spell = "cause light";    break;
	case  1: min_level =  3; spell = "cause serious";  break;
	case  2: min_level =  6; spell = "earthquake";     break;
	case  3: min_level =  7; spell = "blindness";	   break;
	case  4: min_level =  9; spell = "cause critical"; break;
	case  5: min_level = 10; spell = "dispel evil";    break;
	case  6: min_level = 12; spell = "curse";          break;
	case  7: min_level = 13; spell = "flamestrike";    break;
	case  8: 
	case  9:
	case 10: min_level = 15; spell = "harm";           break;
	default: min_level = 16; spell = "dispel magic";   break;
	}

	if ( ch->level >= min_level )
	    break;
    }

    if ( ( sn = skill_lookup( spell ) ) < 0 )
	return FALSE;
    (*skill_table[sn]->spell_fun) ( sn, ch->level, ch, victim );
    return TRUE;
}
Ejemplo n.º 2
0
bool spec_cast_mage( CHAR_DATA *ch )
{
    CHAR_DATA *victim;
    CHAR_DATA *v_next;
    char *spell;
    int sn;

    summon_if_hating( ch );

    if ( ch->position != POS_FIGHTING
       && ch->position !=  POS_EVASIVE
       && ch->position !=  POS_DEFENSIVE
       && ch->position !=  POS_AGGRESSIVE
       && ch->position !=  POS_BERSERK
    )
	return FALSE;

    for ( victim = ch->in_room->first_person; victim; victim = v_next )
    {
	v_next = victim->next_in_room;
	if ( who_fighting( victim ) && number_bits( 2 ) == 0 )
	    break;
    }

    if ( !victim || victim == ch )
	return FALSE;

    for ( ;; )
    {
	int min_level;

	switch ( number_bits( 4 ) )
	{
	case  0: min_level =  0; spell = "black hand";	   break;
	case  1: min_level =  3; spell = "chill touch";    break;
	case  2: min_level =  7; spell = "weaken";         break;
	case  3: min_level =  8; spell = "galvanic whip";  break;
	case  4: min_level = 11; spell = "colour spray";   break;
	case  5: min_level = 12; spell = "weaken";	   break;
	case  6: min_level = 13; spell = "energy drain";   break;
	case  7: min_level = 14; spell = "spectral furor"; break;
	case  8:
	case  9: min_level = 15; spell = "fireball";       break;
	default: min_level = 20; spell = "acid blast";     break;
	}

	if ( ch->level >= min_level )
	    break;
    }

    if ( ( sn = skill_lookup( spell ) ) < 0 )
	return FALSE;
    (*skill_table[sn]->spell_fun) ( sn, ch->level, ch, victim );
    return TRUE;
}
Ejemplo n.º 3
0
bool spec_cast_undead( CHAR_DATA *ch )
{
    CHAR_DATA *victim;
    CHAR_DATA *v_next;
    char *spell;
    int sn;

    summon_if_hating( ch );

    if ( ch->position != POS_FIGHTING
       && ch->position !=  POS_EVASIVE
       && ch->position !=  POS_DEFENSIVE
       && ch->position !=  POS_AGGRESSIVE
       && ch->position !=  POS_BERSERK
    )
	return FALSE;

    for ( victim = ch->in_room->first_person; victim; victim = v_next )
    {
	v_next = victim->next_in_room;
	if ( who_fighting( victim ) == ch && number_bits( 2 ) == 0 )
	    break;
    }

    if ( !victim || victim == ch )
	return FALSE;

    for ( ;; )
    {
	int min_level;

	switch ( number_bits( 4 ) )
	{
	case  0: min_level =  0; spell = "chill touch";    break;
	case  1: min_level = 11; spell = "weaken";         break;
	case  2: min_level = 12; spell = "curse";          break;
	case  3: min_level = 13; spell = "blindness";      break;
	case  4: min_level = 14; spell = "poison";         break;
	case  5: min_level = 15; spell = "energy drain";   break;
	case  6: min_level = 18; spell = "harm";           break;
	default: min_level = 40; spell = "gate";           break;
	}

	if ( ch->level >= min_level )
	    break;
    }

    if ( ( sn = skill_lookup( spell ) ) < 0 )
	return FALSE;
    (*skill_table[sn]->spell_fun) ( sn, ch->level, ch, victim );
    return TRUE;
}
Ejemplo n.º 4
0
SPEC_RET spec_cast_undead( CHAR_DATA *ch )
{
	CHAR_DATA *victim;
	CHAR_DATA *v_next;
	char	  *spell;
	int		   sn;

	summon_if_hating( ch );

	if ( ch->position != POSITION_FIGHT
	  && ch->position != POSITION_EVASIVE
	  && ch->position != POSITION_DEFENSIVE
	  && ch->position != POSITION_AGGRESSIVE
	  && ch->position != POSITION_BERSERK )
	{
		return FALSE;
	}

	for ( victim = ch->in_room->first_person;  victim;  victim = v_next )
	{
		v_next = victim->next_in_room;

		if ( who_fighting(victim) != ch )	continue;
		if ( number_bits(2) == 0 )			continue;

		if ( IS_PG(victim) )
			break;
		if ( IS_MOB(victim) && HAS_BIT(victim->affected_by, AFFECT_CHARM) )
			break;
	}

	if ( !victim )		return FALSE;
	if ( victim == ch )	return FALSE;

	for ( ; ; )
	{
		int min_level;

		switch ( number_bits(4) )
		{
		  case  0:	min_level =  1;		spell = "chill touch";		break;
		  case  1:	min_level = 22;		spell = "weaken";			break;
		  case  2:	min_level = 24;		spell = "curse";			break;
		  case  3:	min_level = 26;		spell = "blindness";		break;
		  case  4:	min_level = 28;		spell = "poison";			break;
		  case  5:	min_level = 30;		spell = "energy drain";		break;
		  case  6:	min_level = 36;		spell = "harm";				break;
		  default:	min_level = 80;		spell = "gate";				break;
		}

		if ( get_level(ch) >= min_level )
			break;
	}

	sn = skill_lookup( spell );
	if ( sn < 0 )
		return FALSE;

	(*table_skill[sn]->spell_fun) ( sn, get_level(ch)/2, ch, victim );
	return TRUE;
}
Ejemplo n.º 5
0
SPEC_RET spec_cast_mage( CHAR_DATA *ch )
{
	CHAR_DATA *victim;
	CHAR_DATA *v_next;
	char	  *spell;
	int		   sn;

	summon_if_hating( ch );

	if ( ch->position != POSITION_FIGHT
	  && ch->position != POSITION_EVASIVE
	  && ch->position != POSITION_DEFENSIVE
	  && ch->position != POSITION_AGGRESSIVE
	  && ch->position != POSITION_BERSERK )
	{
		return FALSE;
	}

	for ( victim = ch->in_room->first_person;  victim;  victim = v_next )
	{
		v_next = victim->next_in_room;

		if ( who_fighting(victim) != ch )	continue;
		if ( number_bits(2) )				continue;

		if ( IS_PG(victim) )
			break;
		if ( IS_MOB(victim) && HAS_BIT(victim->affected_by, AFFECT_CHARM) )
			break;
	}

	if ( !victim )		return FALSE;
	if ( victim == ch )	return FALSE;

	for ( ; ; )
	{
		int min_level;

		switch ( number_bits(4) )
		{
		  case  0:	min_level =  1;		spell = "magic missile";	break;
		  case  1:	min_level =  6;		spell = "chill touch";		break;
		  case  2:	min_level = 14;		spell = "weaken";			break;
		  case  3:	min_level = 16;		spell = "galvanic whip";	break;
		  case  4:	min_level = 22;		spell = "colour spray";		break;
		  case  5:	min_level = 24;		spell = "weaken";			break;
		  case  6:	min_level = 26;		spell = "energy drain";		break;
		  case  7:	min_level = 28;		spell = "spectral furor";	break;
		  case  8:
		  case  9:	min_level = 30;		spell = "fireball";			break;
		  default:	min_level = 40;		spell = "acid blast";		break;
		}

		if ( get_level(ch) >= min_level )
			break;
	}

	sn = skill_lookup( spell );
	if ( sn < 0 )
		return FALSE;

	(*table_skill[sn]->spell_fun) ( sn, get_level(ch)/2, ch, victim );
	return TRUE;
}
Ejemplo n.º 6
0
SPEC_RET spec_cast_cleric( CHAR_DATA *ch )
{
	CHAR_DATA *victim;
	CHAR_DATA *v_next;
	char	  *spell;
	int		   sn;

	summon_if_hating( ch );

	if ( ch->position != POSITION_FIGHT
	  && ch->position != POSITION_EVASIVE
	  && ch->position != POSITION_DEFENSIVE
	  && ch->position != POSITION_AGGRESSIVE
	  && ch->position != POSITION_BERSERK )
	{
		return FALSE;
	}

	for ( victim = ch->in_room->first_person;  victim;  victim = v_next )
	{
		v_next = victim->next_in_room;

		if ( who_fighting(victim) != ch )	continue;
		if ( number_bits(2) )				continue;

		if ( IS_PG(victim) )
			break;
		if ( IS_MOB(victim) && HAS_BIT(victim->affected_by, AFFECT_CHARM) )
			break;
	}

	if ( !victim  )		return FALSE;
	if ( victim == ch )	return FALSE;

	for ( ; ; )
	{
		int min_level;

		/* (FF) (LV) questi min_level forse sono da tarare */
		switch ( number_bits(4) )
		{
		  case  0:	min_level =  1;		spell = "cause light";		break;
		  case  1:	min_level =  6;		spell = "cause serious";	break;
		  case  2:	min_level = 12;		spell = "earthquake";		break;
		  case  3:	min_level = 14;		spell = "blindness";		break;
		  case  4:	min_level = 18;		spell = "cause critical";	break;
		  case  5:	min_level = 20;		spell = "dispel evil";		break;
		  case  6:	min_level = 24;		spell = "curse";			break;
		  case  7:	min_level = 26;		spell = "flamestrike";		break;
		  case  8:
		  case  9:
		  case 10:	min_level = 30;		spell = "harm";				break;
		  default:	min_level = 32;		spell = "dispel magic";		break;
		}

		if ( get_level(ch) >= min_level )
			break;
	}

	sn = skill_lookup( spell );
	if ( sn < 0 )
		return FALSE;

	(*table_skill[sn]->spell_fun) ( sn, get_level(ch)/2, ch, victim );
	return TRUE;
}