// This must be called when any of the following change: // - effects // - bionics // - traits // - underwater // - clothes // With the exception of clothes, all changes to these character attributes must // occur through a function in this class which calls this function. Clothes are // typically added/removed with wear() and takeoff(), but direct access to the // 'wears' vector is still allowed due to refactor exhaustion. void Character::recalc_sight_limits() { sight_max = 9999; sight_boost = 0; sight_boost_cap = 0; // Set sight_max. if (has_effect("blind") || worn_with_flag("BLIND")) { sight_max = 0; } else if (has_effect("in_pit") || (has_effect("boomered") && (!(has_trait("PER_SLIME_OK")))) || (underwater && !has_bionic("bio_membrane") && !has_trait("MEMBRANE") && !worn_with_flag("SWIM_GOGGLES") && !has_trait("CEPH_EYES") && !has_trait("PER_SLIME_OK") ) ) { sight_max = 1; } else if (has_active_mutation("SHELL2")) { // You can kinda see out a bit. sight_max = 2; } else if ( (has_trait("MYOPIC") || has_trait("URSINE_EYE")) && !is_wearing("glasses_eye") && !is_wearing("glasses_monocle") && !is_wearing("glasses_bifocal") && !has_effect("contacts")) { sight_max = 4; } else if (has_trait("PER_SLIME")) { sight_max = 6; } // Set sight_boost and sight_boost_cap, based on night vision. // (A player will never have more than one night vision trait.) sight_boost_cap = 12; // Debug-only NV, by vache's request if (has_trait("DEBUG_NIGHTVISION")) { sight_boost = 59; sight_boost_cap = 59; } else if (has_nv() || is_wearing("rm13_armor_on") || has_active_mutation("NIGHTVISION3") || has_active_mutation("ELFA_FNV") || (has_active_mutation("CEPH_VISION")) ) { // Yes, I'm breaking the cap. I doubt the reality bubble shrinks at night. // BIRD_EYE represents excellent fine-detail vision so I think it works. if (has_trait("BIRD_EYE")) { sight_boost_cap = 13; } sight_boost = sight_boost_cap; } else if (has_active_mutation("ELFA_NV")) { sight_boost = 6; // Elf-a and Bird eyes shouldn't coexist } else if (has_active_mutation("NIGHTVISION2") || has_active_mutation("FEL_NV") || has_active_mutation("URSINE_EYE")) { if (has_trait("BIRD_EYE")) { sight_boost = 5; } else { sight_boost = 4; } } else if (has_active_mutation("NIGHTVISION")) { if (has_trait("BIRD_EYE")) { sight_boost = 2; } else { sight_boost = 1; } } }
bool Character::has_nv() { static bool nv = false; if( !nv_cached ) { nv_cached = true; nv = (worn_with_flag("GNV_EFFECT") || has_active_bionic("bio_night_vision")); } return nv; }
// This must be called when any of the following change: // - effects // - bionics // - traits // - underwater // - clothes // With the exception of clothes, all changes to these character attributes must // occur through a function in this class which calls this function. Clothes are // typically added/removed with wear() and takeoff(), but direct access to the // 'wears' vector is still allowed due to refactor exhaustion. void Character::recalc_sight_limits() { sight_max = 9999; vision_mode_cache.reset(); // Set sight_max. if (has_effect("blind") || worn_with_flag("BLIND") || has_active_bionic("bio_blindfold")) { sight_max = 0; } else if( has_effect("boomered") && (!(has_trait("PER_SLIME_OK"))) ) { sight_max = 1; vision_mode_cache.set( BOOMERED ); } else if (has_effect("in_pit") || (underwater && !has_bionic("bio_membrane") && !has_trait("MEMBRANE") && !worn_with_flag("SWIM_GOGGLES") && !has_trait("CEPH_EYES") && !has_trait("PER_SLIME_OK") ) ) { sight_max = 1; } else if (has_active_mutation("SHELL2")) { // You can kinda see out a bit. sight_max = 2; } else if ( (has_trait("MYOPIC") || has_trait("URSINE_EYE")) && !is_wearing("glasses_eye") && !is_wearing("glasses_monocle") && !is_wearing("glasses_bifocal") && !has_effect("contacts")) { sight_max = 4; } else if (has_trait("PER_SLIME")) { sight_max = 6; } else if( has_effect( "darkness" ) ) { vision_mode_cache.set( DARKNESS ); sight_max = 10; } // Debug-only NV, by vache's request if( has_trait("DEBUG_NIGHTVISION") ) { vision_mode_cache.set( DEBUG_NIGHTVISION ); } if( has_nv() ) { vision_mode_cache.set( NV_GOGGLES ); } if( has_active_mutation("NIGHTVISION3") || is_wearing("rm13_armor_on") ) { vision_mode_cache.set( NIGHTVISION_3 ); } if( has_active_mutation("ELFA_FNV") ) { vision_mode_cache.set( FULL_ELFA_VISION ); } if( has_active_mutation("CEPH_VISION") ) { vision_mode_cache.set( CEPH_VISION ); } if (has_active_mutation("ELFA_NV")) { vision_mode_cache.set( ELFA_VISION ); } if( has_active_mutation("NIGHTVISION2") ) { vision_mode_cache.set( NIGHTVISION_2 ); } if( has_active_mutation("FEL_NV") ) { vision_mode_cache.set( FELINE_VISION ); } if( has_active_mutation("URSINE_EYE") ) { vision_mode_cache.set( URSINE_VISION ); } if (has_active_mutation("NIGHTVISION")) { vision_mode_cache.set(NIGHTVISION_1); } if( has_trait("BIRD_EYE") ) { vision_mode_cache.set( BIRD_EYE); } }