void CMonsterCorpseMemory::update() { for (xr_vector<const CGameObject *>::const_iterator I = monster->memory().item().objects().begin(); I != monster->memory().item().objects().end(); ++I) { if (monster->memory().visual().visible_now(*I)) { const CEntityAlive *p_corpse = smart_cast<const CEntityAlive*>(*I); if (!p_corpse || p_corpse->g_Alive()) continue; add_corpse(p_corpse); } } // удалить устаревших врагов remove_non_actual(); }
void CMonsterEnemyMemory::update() { VERIFY (monster->g_Alive()); CMonsterHitMemory& monster_hit_memory = monster->HitMemory; typedef CObjectManager<const CEntityAlive>::OBJECTS objects_list; objects_list const& objects = monster->memory().enemy().objects(); if ( monster_hit_memory.is_hit() && time() < monster_hit_memory.get_last_hit_time() + 1000 ) { if ( CEntityAlive* enemy = smart_cast<CEntityAlive*>(monster->HitMemory.get_last_hit_object()) ) { if ( monster->CCustomMonster::useful(&monster->memory().enemy(), enemy) && monster->Position().distance_to(enemy->Position()) < monster->get_feel_enemy_who_just_hit_max_distance() ) { add_enemy (enemy); bool const self_is_dog = !!smart_cast<const CAI_Dog*>(monster); if ( self_is_dog ) { CMonsterSquad* const squad = monster_squad().get_squad(monster); squad->set_home_in_danger (); } } } } if ( monster->SoundMemory.IsRememberSound() ) { SoundElem sound; bool dangerous; monster->SoundMemory.GetSound(sound, dangerous); if ( dangerous && Device.dwTimeGlobal < sound.time + 2000 ) { if ( CEntityAlive const* enemy = smart_cast<CEntityAlive const*>(sound.who) ) { float const xz_dist = monster->Position().distance_to_xz(g_actor->Position()); float const y_dist = _abs(monster->Position().y - g_actor->Position().y); if ( monster->CCustomMonster::useful(&monster->memory().enemy(), enemy) && y_dist < 10 && xz_dist < monster->get_feel_enemy_who_made_sound_max_distance() && g_actor->memory().visual().visible_now(monster) ) { add_enemy (enemy); bool const self_is_dog = !!smart_cast<const CAI_Dog*>(monster); if ( self_is_dog ) { CMonsterSquad* const squad = monster_squad().get_squad(monster); squad->set_home_in_danger (); } } } } } for ( objects_list::const_iterator I = objects.begin(); I != objects.end(); ++I ) { const CEntityAlive* enemy = *I; const bool feel_enemy = monster->Position().distance_to(enemy->Position()) < monster->get_feel_enemy_max_distance(); if ( feel_enemy || monster->memory().visual().visible_now(*I) ) add_enemy(*I); } float const feel_enemy_max_distance = monster->get_feel_enemy_max_distance(); if ( g_actor ) { float const xz_dist = monster->Position().distance_to_xz(g_actor->Position()); float const y_dist = _abs(monster->Position().y - g_actor->Position().y); if ( xz_dist < feel_enemy_max_distance && y_dist < 10 && monster->memory().enemy().is_useful(g_actor) && g_actor->memory().visual().visible_now(monster) ) { add_enemy(g_actor); } } // удалить устаревших врагов remove_non_actual(); // обновить опасность for (ENEMIES_MAP_IT it = m_objects.begin(); it != m_objects.end(); it++) { u8 relation_value = u8(monster->tfGetRelationType(it->first)); float dist = monster->Position().distance_to(it->second.position); it->second.danger = (1 + relation_value*relation_value*relation_value) / (1 + dist); } }