/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ #include <glib.h> #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <stdio.h> #include <string.h> #include <time.h> #include <merc.h> int get_vage_bonus (CHAR_DATA *ch) { int ch_age = (get_age(ch) - 17) * 2; /* hours calculation */ if (IS_SWWF(ch)) { if (ch_age >= 1500) return 2; else if (ch_age >= 800) return 1; } return 0; } bool can_see_incog( CHAR_DATA *ch, CHAR_DATA *victim) { bool found = TRUE; if ( !IS_NPC(victim) && IS_SET(victim->act, PLR_INCOG) && get_trust( ch ) < LEVEL_IMMORTAL && ch->in_room != victim->in_room ) found = FALSE; return found; } bool can_see_vampire_wizinvis(CHAR_DATA *victim, int Seeker_Sight_Level, int chance_v) { bool can_see = FALSE; int Obf_Level = 0; if (IS_VAMPIRE(victim)) { Obf_Level = get_disc(victim,DISC_OBFUSCATE); if (IS_ADDED(victim,ADDED_CHAMELEON)) Obf_Level++; if (Seeker_Sight_Level >= Obf_Level && number_percent() > chance_v) can_see = TRUE; } return can_see; } bool can_see_werewolf_wizinvis(CHAR_DATA *victim, int Seeker_Sight_Level, int chance_v) { bool can_see = FALSE; int Obf_Level = 0; if (IS_SWWF(victim)) { Obf_Level = get_auspice(victim,AUSPICE_RAGABASH) + get_vage_bonus(victim); if (Seeker_Sight_Level >= Obf_Level && number_percent() > chance_v) can_see = TRUE; } return can_see; } bool can_see_mage_wizinvis(CHAR_DATA *victim, int Seeker_Sight_Level, int chance_v) { bool can_see = FALSE; int Obf_Level = 0; if (IS_MAGE(victim)) { Obf_Level = has_sphere(victim,SPHERE_CORRESPONDENCE); if (Seeker_Sight_Level >= Obf_Level && number_percent() > chance_v) can_see = TRUE; } return can_see; } bool get_player_wizinvis(CHAR_DATA *victim, int char_sight_level,int chance_v) { bool found = FALSE; switch (victim->creature) { default : break; case CLASS_SWWF: found = can_see_werewolf_wizinvis(victim,char_sight_level,chance_v); break; case CLASS_VAMPIRE: found = can_see_vampire_wizinvis(victim,char_sight_level,chance_v); break; case CLASS_MAGE: found = can_see_mage_wizinvis(victim,char_sight_level,chance_v); break; } return found; } int get_char_sight_level(CHAR_DATA *ch) { int level = 0; switch (ch->creature){ default: break; case CLASS_SWWF: level = get_breed(ch,BREED_LUPUS); break; case CLASS_VAMPIRE: level = get_disc(ch,DISC_AUSPEX); if (IS_ADDED(ch,ADDED_VOICESOFCASTLE)) level++; break; case CLASS_MAGE: level = has_sphere(ch,SPHERE_CORRESPONDENCE); break; } return level; } bool see_wizinvis( CHAR_DATA *ch, CHAR_DATA *victim) { int chance_v = 50; bool found_victim = FALSE; if (IS_SET(victim->act,PLR_WIZINVIS)) { if (!IS_NPC(victim) ) { /* * Player */ if (IS_IMMORTAL(victim)) { if ( get_trust(ch) >= victim->invis_level ) found_victim = TRUE; } else { /* * Mortal Character */ if (IS_IMMORTAL(ch)) return TRUE; /* * Non Avatar's don't have vanish */ if (victim->level <= 2) return TRUE; /* * Now check Avatar Victim's */ if ( victim->pk_timer > 4 && ch->level > 2 ) { found_victim = TRUE; } else { if (!IS_NPC(ch)) { int char_sight_level = 0; chance_v = 50; if (IS_MERIT(ch,MERIT_PERCEPTIVE)) chance_v -= 30; if (IS_FLAW(ch,FLAW_UNPERCEPTIVE)) chance_v += 30; char_sight_level = get_char_sight_level(ch); found_victim = get_player_wizinvis(victim,char_sight_level,chance_v); } else { if (IS_SET(ch->act,ACT_HOLYLIGHT)) found_victim = TRUE; } } } } else { //Mobile if (!IS_NPC(ch) && IS_IMMORTAL(ch)) { found_victim = TRUE; } else { if (IS_SET(ch->act,ACT_HOLYLIGHT)) found_victim = TRUE; } } } else { found_victim = TRUE; } return found_victim; } bool can_see_plane_normal(CHAR_DATA *ch){ bool can_see_char = FALSE; if (ch->plane == PLANE_SHADOW && IS_SET(ch->sight, SIGHT_SHADOW)) can_see_char = TRUE; if (ch->plane == PLANE_SPIRIT && IS_SET(ch->sight, SIGHT_SPIRIT)) can_see_char = TRUE; return can_see_char; } bool can_see_plane_shadow(CHAR_DATA *ch){ bool can_see = FALSE; if (ch->plane == PLANE_NORMAL && IS_SET(ch->sight, SIGHT_SHADOW)) can_see = TRUE; return can_see; } bool can_see_plane_spirit(CHAR_DATA *ch){ bool can_see = FALSE; if (ch->plane == PLANE_NORMAL && IS_SET(ch->sight, SIGHT_SPIRIT)) can_see = TRUE; return can_see; } bool can_see_plane_dead(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_earth(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_immortal(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_punishment(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_ethereal(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_umbra(CHAR_DATA *ch){ bool can_see = FALSE; if (ch->plane == PLANE_NORMAL && IS_SET(ch->sight, SIGHT_UMBRA)) can_see = TRUE; return can_see; } bool has_planesight(CHAR_DATA *ch, CHAR_DATA *victim){ bool found = FALSE; //Immortals can see all! if (IS_IMMORTAL(ch)) return TRUE; if (ch->plane != victim->plane) { switch (victim->plane){ case PLANE_NORMAL: found = can_see_plane_normal(ch); break; case PLANE_DEAD: found = can_see_plane_dead(ch); break; case PLANE_SHADOW: found = can_see_plane_shadow(ch); break; case PLANE_SPIRIT: found = can_see_plane_spirit(ch); break; case PLANE_UMBRA: found = can_see_plane_umbra(ch); break; case PLANE_ETHEREAL: found = can_see_plane_ethereal(ch); break; case PLANE_EARTH: found = can_see_plane_earth(ch); break; case PLANE_PUNISHMENT: found = can_see_plane_punishment(ch); break; case PLANE_IMMORTAL: found = can_see_plane_immortal(ch); break; default: break; } } else return TRUE; return found; } /* * True if char can see victim. */ bool can_see( CHAR_DATA *ch, CHAR_DATA *victim ) { //Char is looking at self.. if ( ch == victim ) return TRUE; //If the victim has a artifact.. we want people to see em if (IS_ITEMAFF(victim, ITEMA_ARTIFACT) && !IS_IMMORTAL(victim)) return TRUE; if (!has_planesight(ch,victim)) return FALSE; if (!can_see_incog(ch,victim)) return FALSE; //Wizinvis(Vanish) if (!see_wizinvis(ch,victim)) return FALSE; if (IS_RAFFECTED(ch->in_room, ROOM_AFF_AEOLUS )) { if (!IS_SET(ch->sight, SIGHT_PDARK)) return FALSE; } if (IS_RAFFECTED(ch->in_room,ROOM_AFF_DARK)) { if (!IS_SET(ch->sight,SIGHT_NIGHTSIGHT) && !IS_SET(ch->sight,SIGHT_INFRARED)) return FALSE; } if ( IS_HEAD(ch, LOST_EYE_L) || IS_HEAD(ch, LOST_EYE_R) ) return FALSE; if ( IS_EXTRA(ch, BLINDFOLDED) && !IS_VAMPAFF(ch, VAM_SONIC)) return FALSE; // //Invis Check vs Detect Invis if (IS_SET(victim->affected_by,AFF_INVISIBLE) && (!IS_SET(ch->sight,SIGHT_INVISABLE) && !IS_SET(ch->act, PLR_HOLYLIGHT))){ return FALSE; } return TRUE; } bool can_see_plane_normal_obj(CHAR_DATA *ch){ bool can_see = FALSE; if (ch->plane == PLANE_SHADOW && IS_SET(ch->sight, SIGHT_SHADOW)) can_see = TRUE; if (ch->plane == PLANE_SPIRIT && IS_SET(ch->sight, SIGHT_SPIRIT)) can_see = TRUE; return can_see; } bool can_see_plane_shadow_obj(CHAR_DATA *ch){ bool can_see = FALSE; if (ch->plane == PLANE_NORMAL && IS_SET(ch->sight, SIGHT_SHADOW)) can_see = TRUE; return can_see; } bool can_see_plane_spirit_obj(CHAR_DATA *ch){ bool can_see = FALSE; if (ch->plane == PLANE_NORMAL && IS_SET(ch->sight, SIGHT_SPIRIT)) can_see = TRUE; return can_see; } bool can_see_plane_dead_obj(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_earth_obj(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_immortal_obj(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_punishment_obj(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_ethereal_obj(CHAR_DATA *ch){ bool can_see = FALSE; return can_see; } bool can_see_plane_umbra_obj(CHAR_DATA *ch){ bool can_see = FALSE; if (ch->plane == PLANE_NORMAL && IS_SET(ch->sight, SIGHT_UMBRA)) can_see = TRUE; return can_see; } bool can_seeobj_plane(CHAR_DATA *ch, OBJ_DATA *obj){ bool can_see = FALSE; if (ch->plane == obj->plane) return TRUE; if (IS_IMMORTAL(ch)) return TRUE; switch (obj->plane){ case PLANE_NORMAL: can_see = can_see_plane_normal_obj(ch); break; case PLANE_DEAD: can_see = can_see_plane_dead_obj(ch); break; case PLANE_SHADOW: can_see = can_see_plane_shadow_obj(ch); break; case PLANE_SPIRIT: can_see = can_see_plane_spirit_obj(ch); break; case PLANE_UMBRA: can_see = can_see_plane_umbra_obj(ch); break; case PLANE_ETHEREAL: can_see = can_see_plane_ethereal_obj(ch); break; case PLANE_EARTH: can_see = can_see_plane_earth_obj(ch); break; case PLANE_PUNISHMENT: can_see = can_see_plane_punishment_obj(ch); break; case PLANE_IMMORTAL: can_see = can_see_plane_immortal_obj(ch); break; default: break; } return can_see; } /* * True if char can see obj. */ bool can_see_obj( CHAR_DATA *ch, OBJ_DATA *obj ) { if ( !IS_IMMORTAL(ch) && obj->carried_by != NULL && !IS_NPC(obj->carried_by) && ch != obj->carried_by && IS_SET(obj->carried_by->added, ADDED_CLOAK) ) return FALSE; if (!can_seeobj_plane(ch,obj) && !IS_IMMORTAL(ch)) return FALSE; //Invis Check && Vanish Check if (IS_SET(obj->extra_flags,ITEM_INVIS) && !IS_SET(ch->sight,SIGHT_INVISABLE) && !IS_SET(ch->act, PLR_HOLYLIGHT)){ return FALSE; } if ( IS_ITEMAFF(ch, ITEMA_VISION) ) return TRUE; if ( !IS_NPC(ch) && IS_VAMPAFF(ch, VAM_SONIC) ) return TRUE; if ( obj->item_type == ITEM_POTION ) return TRUE; if ( IS_HEAD(ch, LOST_EYE_L) && IS_HEAD(ch, LOST_EYE_R) ) return FALSE; if ( IS_EXTRA(ch, BLINDFOLDED) ) return FALSE; if ( obj->item_type == ITEM_LIGHT && obj->value[2] != 0 ) return TRUE; if (IS_RAFFECTED(ch->in_room,ROOM_AFF_DARK)) { if (!IS_IMMORTAL( ch )) return FALSE; else return TRUE; } if ( !IS_NPC(ch) && IS_HEAD(ch, LOST_HEAD) && ch->in_room != NULL && ch->in_room->vnum == ROOM_VNUM_IN_OBJECT) return TRUE; if ( !IS_NPC(ch) && IS_EXTRA(ch, EXTRA_OSWITCH) && ch->in_room != NULL && ch->in_room->vnum == ROOM_VNUM_IN_OBJECT) return TRUE; return TRUE; } /* * True if char can drop obj. */ bool can_drop_obj( CHAR_DATA *ch, OBJ_DATA *obj ) { if ( !IS_SET(obj->extra_flags, ITEM_NODROP) ) return TRUE; if ( !IS_NPC(ch) && ch->level >= LEVEL_IMMORTAL ) return TRUE; return FALSE; }