bool spec_jedi_healer( CHAR_DATA * ch ) { CHAR_DATA *victim; CHAR_DATA *v_next; if( !IS_AWAKE( ch ) ) return FALSE; for( victim = ch->in_room->first_person; victim; victim = v_next ) { v_next = victim->next_in_room; if( victim != ch && can_see( ch, victim ) && number_bits( 1 ) == 0 ) break; } if( !victim ) return FALSE; switch ( number_bits( 12 ) ) { case 0: act( AT_MAGIC, "$n pauses and concentrates for a moment.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup( "armor" ), ch->top_level, ch, victim ); return TRUE; case 1: act( AT_MAGIC, "$n pauses and concentrates for a moment.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup( "good fortune" ), ch->top_level, ch, victim ); return TRUE; case 2: act( AT_MAGIC, "$n pauses and concentrates for a moment.", ch, NULL, NULL, TO_ROOM ); spell_cure_blindness( skill_lookup( "cure blindness" ), ch->top_level, ch, victim ); return TRUE; case 3: act( AT_MAGIC, "$n pauses and concentrates for a moment.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup( "cure light" ), ch->top_level, ch, victim ); return TRUE; case 4: act( AT_MAGIC, "$n pauses and concentrates for a moment.", ch, NULL, NULL, TO_ROOM ); spell_cure_poison( skill_lookup( "cure poison" ), ch->top_level, ch, victim ); return TRUE; case 5: act( AT_MAGIC, "$n pauses and concentrates for a moment.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup( "refresh" ), ch->top_level, ch, victim ); return TRUE; } return FALSE; }
/* * Procedure speciali per i Mob */ SPEC_RET spec_cast_adept( CHAR_DATA *ch ) { CHAR_DATA *victim; CHAR_DATA *v_next; if ( !is_awake(ch) ) return FALSE; if ( ch->fighting ) return FALSE; for ( victim = ch->in_room->first_person; victim; victim = v_next ) { v_next = victim->next_in_room; if ( victim == ch ) continue; if ( !can_see(ch, victim) ) continue; if ( number_bits(1) == 0 ) break; } if ( !victim ) return FALSE; switch ( number_bits(4) ) { case 0: act( AT_MAGIC, "$n pronuncia la parola 'ciroht'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup("armor"), get_level(ch)/2, ch, victim ); return TRUE; case 1: act( AT_MAGIC, "$n pronuncia la parola 'sunimod'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup("bless"), get_level(ch)/2, ch, victim ); return TRUE; case 2: act( AT_MAGIC, "$n pronuncia la parola 'suah'.", ch, NULL, NULL, TO_ROOM ); spell_cure_blindness( skill_lookup("cure blindness"), get_level(ch)/2, ch, victim ); return TRUE; case 3: act( AT_MAGIC, "$n pronuncia la parola 'nran'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup("cure light"), get_level(ch)/2, ch, victim ); return TRUE; case 4: act( AT_MAGIC, "$n pronuncia la parola 'nyrcs'.", ch, NULL, NULL, TO_ROOM ); spell_cure_poison( skill_lookup("cure poison"), get_level(ch)/2, ch, victim ); return TRUE; case 5: act( AT_MAGIC, "$n pronuncia la parola 'gartla'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup("refresh"), get_level(ch)/2, ch, victim ); return TRUE; case 6: act( AT_MAGIC, "$n pronuncia la parola 'naimad'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup("cure serious"), get_level(ch)/2, ch, victim ); return TRUE; case 7: act( AT_MAGIC, "$n pronuncia la parola 'gorog'.", ch, NULL, NULL, TO_ROOM ); spell_remove_curse( skill_lookup("remove curse"), get_level(ch)/2, ch, victim ); return TRUE; } return FALSE; }
bool spec_cast_adept( CHAR_DATA *ch ) { CHAR_DATA *victim; CHAR_DATA *v_next; if ( !IS_AWAKE(ch) || ch->fighting ) return FALSE; for ( victim = ch->in_room->first_person; victim; victim = v_next ) { v_next = victim->next_in_room; if ( victim != ch && can_see( ch, victim ) && number_bits( 1 ) == 0 ) break; } if ( !victim ) return FALSE; switch ( number_bits( 3 ) ) { case 0: act( AT_MAGIC, "$n utters the word 'ciroht'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup( "armor" ), ch->level, ch, victim ); return TRUE; case 1: act( AT_MAGIC, "$n utters the word 'sunimod'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup( "bless" ), ch->level, ch, victim ); return TRUE; case 2: act( AT_MAGIC, "$n utters the word 'suah'.", ch, NULL, NULL, TO_ROOM ); spell_cure_blindness( skill_lookup( "cure blindness" ), ch->level, ch, victim ); return TRUE; case 3: act( AT_MAGIC, "$n utters the word 'nran'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup( "cure light" ), ch->level, ch, victim ); return TRUE; case 4: act( AT_MAGIC, "$n utters the word 'nyrcs'.", ch, NULL, NULL, TO_ROOM ); spell_cure_poison( skill_lookup( "cure poison" ), ch->level, ch, victim ); return TRUE; case 5: act( AT_MAGIC, "$n utters the word 'gartla'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup( "refresh" ), ch->level, ch, victim ); return TRUE; case 6: act( AT_MAGIC, "$n utters the word 'naimad'.", ch, NULL, NULL, TO_ROOM ); spell_smaug( skill_lookup( "cure serious" ), ch->level, ch, victim ); return TRUE; case 7: act( AT_MAGIC, "$n utters the word 'gorog'.", ch, NULL, NULL, TO_ROOM ); spell_remove_curse( skill_lookup( "remove curse" ), ch->level, ch, victim ); return TRUE; } return FALSE; }
/* Replaces violence_update */ void ev_violence( void *data ) { char_data *ch = ( char_data * ) data; if( !ch ) { bug( "%s: nullptr ch pointer!", __func__ ); return; } char_data *victim = ch->who_fighting( ); if( !victim || !ch->in_room || !ch->name || ( ch->in_room != victim->in_room ) ) { ch->stop_fighting( true ); return; } if( ch->char_died( ) ) { ch->stop_fighting( true ); return; } /* * Let the battle begin! */ if( ch->has_aflag( AFF_PARALYSIS ) ) { add_event( 2, ev_violence, ch ); return; } ch_ret retcode = rNONE; if( ch->in_room->flags.test( ROOM_SAFE ) ) { log_printf( "%s: %s fighting %s in a SAFE room.", __func__, ch->name, victim->name ); ch->stop_fighting( true ); } else if( ch->IS_AWAKE( ) && ch->in_room == victim->in_room ) retcode = multi_hit( ch, victim, TYPE_UNDEFINED ); else ch->stop_fighting( false ); if( ch->char_died( ) ) return; if( retcode == rCHAR_DIED || !( victim = ch->who_fighting( ) ) ) return; /* * Mob triggers * -- Added some victim death checks, because it IS possible.. -- Alty */ rprog_rfight_trigger( ch ); if( ch->char_died( ) || victim->char_died( ) ) return; mprog_hitprcnt_trigger( ch, victim ); if( ch->char_died( ) || victim->char_died( ) ) return; mprog_fight_trigger( ch, victim ); if( ch->char_died( ) || victim->char_died( ) ) return; /* * NPC special attack flags - Thoric */ int attacktype = -2, cnt = -2; if( ch->isnpc( ) ) { if( ch->has_attacks( ) ) { attacktype = -1; if( 30 + ( ch->level / 4 ) >= number_percent( ) ) { cnt = 0; for( ;; ) { if( cnt++ > 10 ) { attacktype = -1; break; } attacktype = number_range( 7, MAX_ATTACK_TYPE - 1 ); if( ch->has_attack( attacktype ) ) break; } switch ( attacktype ) { default: break; case ATCK_BASH: interpret( ch, "bash" ); retcode = global_retcode; break; case ATCK_STUN: interpret( ch, "stun" ); retcode = global_retcode; break; case ATCK_GOUGE: interpret( ch, "gouge" ); retcode = global_retcode; break; case ATCK_AGE: do_ageattack( ch, "" ); retcode = global_retcode; break; case ATCK_DRAIN: retcode = spell_energy_drain( skill_lookup( "energy drain" ), ch->level, ch, victim ); break; case ATCK_FIREBREATH: retcode = spell_fire_breath( skill_lookup( "fire breath" ), ch->level, ch, victim ); break; case ATCK_FROSTBREATH: retcode = spell_frost_breath( skill_lookup( "frost breath" ), ch->level, ch, victim ); break; case ATCK_ACIDBREATH: retcode = spell_acid_breath( skill_lookup( "acid breath" ), ch->level, ch, victim ); break; case ATCK_LIGHTNBREATH: retcode = spell_lightning_breath( skill_lookup( "lightning breath" ), ch->level, ch, victim ); break; case ATCK_GASBREATH: retcode = spell_gas_breath( skill_lookup( "gas breath" ), ch->level, ch, victim ); break; case ATCK_SPIRALBLAST: retcode = spell_spiral_blast( skill_lookup( "spiral blast" ), ch->level, ch, victim ); break; case ATCK_POISON: retcode = spell_smaug( gsn_poison, ch->level, ch, victim ); break; case ATCK_NASTYPOISON: retcode = spell_smaug( gsn_poison, ch->level, ch, victim ); break; case ATCK_GAZE: break; case ATCK_BLINDNESS: retcode = spell_smaug( skill_lookup( "blindness" ), ch->level, ch, victim ); break; case ATCK_CAUSESERIOUS: retcode = spell_smaug( skill_lookup( "cause serious" ), ch->level, ch, victim ); break; case ATCK_EARTHQUAKE: retcode = spell_smaug( skill_lookup( "earthquake" ), ch->level, ch, victim ); break; case ATCK_CAUSECRITICAL: retcode = spell_smaug( skill_lookup( "cause critical" ), ch->level, ch, victim ); break; case ATCK_CURSE: retcode = spell_smaug( skill_lookup( "curse" ), ch->level, ch, victim ); break; case ATCK_FLAMESTRIKE: retcode = spell_smaug( skill_lookup( "flamestrike" ), ch->level, ch, victim ); break; case ATCK_HARM: retcode = spell_smaug( skill_lookup( "harm" ), ch->level, ch, victim ); break; case ATCK_FIREBALL: retcode = spell_smaug( skill_lookup( "fireball" ), ch->level, ch, victim ); break; case ATCK_COLORSPRAY: retcode = spell_smaug( skill_lookup( "colour spray" ), ch->level, ch, victim ); break; case ATCK_WEAKEN: retcode = spell_smaug( skill_lookup( "weaken" ), ch->level, ch, victim ); break; } if( attacktype != -1 && ( retcode == rCHAR_DIED || ch->char_died( ) ) ) return; } } /* * NPC special defense flags - Thoric */ if( ch->has_defenses( ) ) { /* * Fix for character not here bugs --Shaddai */ if( ch->char_died( ) || victim->char_died( ) ) return; attacktype = -1; if( 50 + ( ch->level / 4 ) > number_percent( ) ) { cnt = 0; for( ;; ) { if( cnt++ > 10 ) { attacktype = -1; break; } attacktype = number_range( 2, MAX_DEFENSE_TYPE - 1 ); if( ch->has_defense( attacktype ) ) break; } switch ( attacktype ) { default: break; case DFND_CURELIGHT: act( AT_MAGIC, "$n mutters a few incantations...and looks a little better.", ch, nullptr, nullptr, TO_ROOM ); retcode = spell_smaug( skill_lookup( "cure light" ), ch->level, ch, ch ); break; case DFND_CURESERIOUS: act( AT_MAGIC, "$n mutters a few incantations...and looks a bit better.", ch, nullptr, nullptr, TO_ROOM ); retcode = spell_smaug( skill_lookup( "cure serious" ), ch->level, ch, ch ); break; case DFND_CURECRITICAL: act( AT_MAGIC, "$n mutters a few incantations...and looks healthier.", ch, nullptr, nullptr, TO_ROOM ); retcode = spell_smaug( skill_lookup( "cure critical" ), ch->level, ch, ch ); break; case DFND_HEAL: act( AT_MAGIC, "$n mutters a few incantations...and looks much healthier.", ch, nullptr, nullptr, TO_ROOM ); retcode = spell_smaug( skill_lookup( "heal" ), ch->level, ch, ch ); break; case DFND_DISPELMAGIC: if( !victim->affects.empty( ) ) { act( AT_MAGIC, "$n utters an incantation...", ch, nullptr, nullptr, TO_ROOM ); retcode = spell_dispel_magic( skill_lookup( "dispel magic" ), ch->level, ch, victim ); } break; case DFND_DISPELEVIL: act( AT_MAGIC, "$n utters an incantation...", ch, nullptr, nullptr, TO_ROOM ); retcode = spell_dispel_evil( skill_lookup( "dispel evil" ), ch->level, ch, victim ); break; case DFND_FIRESHIELD: if( !ch->has_aflag( AFF_FIRESHIELD ) ) { act( AT_MAGIC, "$n utters a few incantations...", ch, nullptr, nullptr, TO_ROOM ); retcode = spell_smaug( skill_lookup( "fireshield" ), ch->level, ch, ch ); } else retcode = rNONE; break; case DFND_SHOCKSHIELD: if( !ch->has_aflag( AFF_SHOCKSHIELD ) ) { act( AT_MAGIC, "$n utters a few incantations...", ch, nullptr, nullptr, TO_ROOM ); retcode = spell_smaug( skill_lookup( "shockshield" ), ch->level, ch, ch ); } else retcode = rNONE; break; case DFND_SANCTUARY: if( !ch->has_aflag( AFF_SANCTUARY ) ) { act( AT_MAGIC, "$n utters a few incantations...", ch, nullptr, nullptr, TO_ROOM ); retcode = spell_smaug( skill_lookup( "sanctuary" ), ch->level, ch, ch ); } else retcode = rNONE; break; } if( attacktype != -1 && ( retcode == rCHAR_DIED || ch->char_died( ) ) ) return; } } } // Attack values reset - past here they mean nothing and I'm on a bughunt dammit! attacktype = -2; cnt = -2; retcode = -2; /* * Fun for the whole family! */ list < char_data * >::iterator ich; for( ich = ch->in_room->people.begin( ); ich != ch->in_room->people.end( ); ) { char_data *rch = *ich; ++ich; if( ch->in_room != rch->in_room ) break; if( rch->IS_AWAKE( ) && !rch->fighting ) { /* * PC's auto-assist others in their group. */ if( !ch->isnpc( ) || ch->has_aflag( AFF_CHARM ) || ch->has_actflag( ACT_PET ) ) { if( rch->isnpc( ) && ( rch->has_aflag( AFF_CHARM ) || rch->is_pet( ) ) ) { multi_hit( rch, victim, TYPE_UNDEFINED ); continue; } if( is_same_group( ch, rch ) && rch->has_pcflag( PCFLAG_AUTOASSIST ) ) { multi_hit( rch, victim, TYPE_UNDEFINED ); continue; } } /* * NPC's assist NPC's of same type or 12.5% chance regardless. */ if( !rch->is_pet( ) && !rch->has_aflag( AFF_CHARM ) && !rch->has_actflag( ACT_NOASSIST ) ) { if( ch->char_died( ) ) break; if( rch->pIndexData == ch->pIndexData || number_bits( 3 ) == 0 ) { list < char_data * >::iterator ich2; char_data *target = nullptr; int number = 0; for( ich2 = ch->in_room->people.begin( ); ich2 != ch->in_room->people.end( ); ++ich2 ) { char_data *vch = *ich2; if( rch->can_see( vch, false ) && is_same_group( vch, victim ) && number_range( 0, number ) == 0 ) { if( vch->mount && vch->mount == rch ) target = nullptr; else { target = vch; ++number; } } } if( target ) multi_hit( rch, target, TYPE_UNDEFINED ); } } } } /* * If we are both still here lets get together and do it again some time :) */ if( ch && victim && victim->position != POS_DEAD && ch->position != POS_DEAD ) add_event( 2, ev_violence, ch ); }