/* Cat spec from Ansalonmud.com - DSL If you want to give credit, cool Include this in the bools in special.c No warrantees etc, this is provided 'as is' */ /* In the defines add */ DECLARE_SPEC_FUN( spec_alleycat ); /* In const struct spec_type spec_table add */ { "spec_alleycat", spec_alleycat }, bool spec_alleycat( CHAR_DATA *ch ) { CHAR_DATA *victim; CHAR_DATA *v_next; if ( ch->position != POS_STANDING ) return FALSE; // Look for PREY for ( victim = ch->in_room->people; victim != NULL; victim = v_next ) { v_next = victim->next_in_room; if (is_safe (ch, victim) || (victim == ch)) continue; if ( !IS_NPC(victim) || victim->level >= ch->level + 6 || number_bits( 4 ) != 0 || !can_see(ch,victim)) continue; if (!is_name("rat", victim->name) && !is_name("mouse", victim->name) && !is_name("bird", victim->name) && !is_name("swallow", victim->name) && !is_name("sparrow", victim->name)) continue; if ( IS_AWAKE(victim) && number_range( 0, ch->level ) <= ch->level / 2 ) { act( "$n arches $s back and yowls at you!", ch, NULL, victim, TO_VICT ); act( "$n arches $s back at $N and yowls!", ch, NULL, victim, TO_NOTVICT ); return TRUE; } else { //Unnecessary unless you have changed hide/vis messages, comment out if wanted. if (!IS_AFFECTED(ch,AFF_HIDE)) SET_BIT(ch->affected_by,AFF_HIDE); if (ch->level >= victim->level || victim->level - ch->level < 5) { //If you've made do_bite() as a combat action; //uncomment the next line //do_function (ch, &do_bite, victim->name); multi_hit( ch, victim, TYPE_UNDEFINED ); return TRUE; } else return FALSE; } }// End PREY section if (ch->hit < ch->max_hit) return FALSE; // Not friendly when hurt // Look for FRIENDS for ( victim = ch->in_room->people; victim != NULL; victim = v_next ) { v_next = victim->next_in_room; if (!can_see (ch,victim) || (victim == ch)) continue; /* IS_KENDER(ch) etc are defined in merc.h such as: #define IS_KENDER(ch) (ch->race == race_lookup("kender")) You'll want to make these for any race you want the cats to be MORE friendly to */ // Cats like little people better, not evils though if ((IS_KENDER(victim) || IS_AGHAR(victim) || IS_NEIDAR(victim) || IS_HYLAR(victim) || IS_GNOME(victim))) { if (number_bits (4) !=0) continue; } /* IS_MINOTAUR(ch) etc are defined in merc.h such as: #define IS_MINOTAUR(ch) (ch->race == race_lookup("minotaur")) You'll want to make these for any race you want the cats to ignore or even 'fear' if you add that. */ else if (IS_MINOTAUR(victim) || IS_GOBLIN(victim) || IS_HOBGOBLIN(victim) || IS_OGRE(victim)) continue; else if (number_bits (8) !=0) continue; if (is_name("rat", victim->name) || is_name("mouse", victim->name) || is_name("bird", victim->name) || is_name("swallow", victim->name) || is_name("sparrow", victim->name) || is_name("dog", victim->name) || !IS_HUMANOID(victim)) continue; switch (number_range (1, 12)) // Positive Reaction Switch { default: case 1: case 2: case 3: { act( "$n quietly meows at you.", ch, NULL, victim, TO_VICT ); act( "$n quietly meows at $N.", ch, NULL, victim, TO_NOTVICT ); return TRUE; } break; case 4: case 5: { act( "$n purrs at you and rubs against your leg.", ch, NULL, victim, TO_VICT ); act( "$n purrs at $N and rubs against $S leg.", ch, NULL, victim, TO_NOTVICT ); return TRUE; } break; case 6: { act( "$n meows at you loudly.", ch, NULL, victim, TO_VICT ); act( "$n meows at $N loudly.", ch, NULL, victim, TO_NOTVICT ); return TRUE; } break; case 7: case 8: { act( "$n looks at you and begins cleaning $mself.", ch, NULL, victim, TO_VICT ); act( "$n looks at $N and begins cleaning $mself.", ch, NULL, victim, TO_NOTVICT ); return TRUE; } break; case 9: case 10: if (victim->position >= POS_STANDING) { act( "$n walks around your legs and purrs.", ch, NULL, victim, TO_VICT ); act( "$n walks around $N's legs and purrs.", ch, NULL, victim, TO_NOTVICT ); } else { act( "$n crawls up onto your lap for a moment and rubs against you.", ch, NULL, victim, TO_VICT ); act( "$n crawls up onto $N's lap and rubs against $M for a moment.", ch, NULL, victim, TO_NOTVICT ); } return TRUE; break; case 11: case 12: if (victim->position >= POS_STANDING) { act ("$n yawns and stretches, then curls up.", ch, NULL, NULL, TO_ROOM); do_function (ch, &do_sleep, ""); return TRUE; } break; }// End Random Positive Reaction Switch }// End FRIEND section return FALSE; }