void CStateManagerZombie::execute() { if (object->com_man().ta_is_active()) return; u32 state_id = u32(-1); if (!object->is_under_control()) { const CEntityAlive* enemy = object->EnemyMan.get_enemy(); if (enemy) { state_id = eStateAttack; } else if (check_state(eStateHearHelpSound)) { state_id = eStateHearHelpSound; } else if (object->hear_interesting_sound || object->hear_dangerous_sound) { state_id = eStateHearInterestingSound; } else { if (can_eat()) state_id = eStateEat; else state_id = eStateRest; } } else state_id = eStateControlled; // установить текущее состояние select_state(state_id); // выполнить текущее состояние get_state_current()->execute(); prev_substate = current_substate; }
void CStateManagerFracture::execute() { u32 state_id = u32(-1); const CEntityAlive* enemy = object->EnemyMan.get_enemy(); if (enemy) { switch (object->EnemyMan.get_danger_type()) { case eStrong: state_id = eStatePanic; break; case eWeak: state_id = eStateAttack; break; } } else if (object->HitMemory.is_hit()) { state_id = eStateHitted; } else if (object->hear_interesting_sound || object->hear_dangerous_sound) { state_id = eStateHearDangerousSound; } else { if (can_eat()) state_id = eStateEat; else { // Rest & Idle states here state_id = eStateRest; } } // установить текущее состояние select_state(state_id); // выполнить текущее состояние get_state_current()->execute(); prev_substate = current_substate; }
void CStateManagerDog::execute() { u32 state_id = u32(-1); if (!object->is_under_control()) { const CEntityAlive* enemy = object->EnemyMan.get_enemy(); if (enemy) { switch (object->EnemyMan.get_danger_type()) { case eStrong: state_id = eStatePanic; break; case eWeak: state_id = eStateAttack; break; } } else if (object->HitMemory.is_hit()) { state_id = eStateHitted; } else if (check_state(eStateHearHelpSound)) { state_id = eStateHearHelpSound; } else if (object->hear_interesting_sound) { state_id = eStateHearInterestingSound; } else if (object->hear_dangerous_sound) { state_id = eStateHearDangerousSound; } else { if (can_eat()) state_id = eStateEat; else state_id = eStateRest; } } else state_id = eStateControlled; select_state (state_id); // выполнить текущее состояние get_state_current()->execute(); prev_substate = current_substate; }
void CStateManagerPoltergeist::execute() { u32 state_id = u32(-1); if ( object->EnemyMan.get_enemy() && object->detected_enemy() ) { state_id = eStateAttack_AttackHidden; } else { state_id = eStateRest; } //const CEntityAlive* enemy = object->EnemyMan.get_enemy(); //if (enemy) { // if (object->is_hidden()) state_id = eStateAttack_AttackHidden; // else { // switch (object->EnemyMan.get_danger_type()) { // case eStrong: state_id = eStatePanic; break; // case eWeak: state_id = eStateAttack; break; // } // } //} else if (object->HitMemory.is_hit() && !object->is_hidden()) { // state_id = eStateHitted; //} else if (object->hear_dangerous_sound) { // if (!object->is_hidden()) state_id = eStateHearDangerousSound; // else state_id = eStateHearInterestingSound; //} else if (object->hear_interesting_sound ) { // state_id = eStateHearInterestingSound; //} else { // if (can_eat()) state_id = eStateEat; // else state_id = eStateRest; // // if (state_id == eStateEat) { // if (object->CorpseMan.get_corpse()->Position().distance_to(object->Position()) < 5.f) { // if (object->is_hidden()) { // object->CEnergyHolder::deactivate(); // } // // object->DisableHide(); // } // } //} ////if (state_id == eStateAttack_AttackHidden) polter_attack(); //if ((prev_substate == eStateEat) && (state_id != eStateEat)) // object->EnableHide(); select_state(state_id); // выполнить текущее состояние get_state_current()->execute(); prev_substate = current_substate; }
static void change_state_if_necessary(void) { dsme_state_t next_state = select_state(); if (current_state != next_state) { try_to_change_state(next_state); } }
void CStateManagerPsyDog::execute() { const CEntityAlive* enemy = object->EnemyMan.get_enemy(); if (enemy && dynamic_cast<const CActor*>(enemy) && smart_cast<CPsyDog*>(object)->must_hide()) { select_state(eStateAttack_Psy); // выполнить текущее состояние get_state_current()->execute(); prev_substate = current_substate; } else { inherited::execute(); } }
void CPolterFlame::create_flame(const CObject *target_object) { Fvector position; if (!get_valid_flame_position(target_object, position)) return; SFlameElement *element = new SFlameElement(); element->position = position; element->target_object = target_object; element->time_started = time(); element->sound.clone (m_sound, st_Effect,SOUND_TYPE_WORLD); element->sound.play_at_pos (m_object,element->position); element->particles_object = 0; element->time_last_hit = 0; Fvector target_point = get_head_position(const_cast<CObject*>(target_object)); element->target_dir.sub (target_point, element->position); element->target_dir.normalize (); m_flames.push_back (element); select_state (element, ePrepare); m_time_flame_started = time(); }
void CPolterFlame::update_schedule() { inherited::update_schedule(); //--------------------------------------------------------------------- // Update Scanner if (m_object->g_Alive()) { // check the start of scanning if (!m_state_scanning && !m_object->EnemyMan.get_enemy()) { // check radius if (Actor()->Position().distance_to(m_object->Position()) < m_scan_radius) { // check timing if (m_scan_next_time < time()) { // start here m_state_scanning = true; // играть звук //m_scan_sound.play_at_pos(m_object, get_head_position(Actor()),sm_2D); ::Sound->play_at_pos(m_scan_sound, 0, Actor()->Position()); // постпроцесс Actor()->Cameras().AddPPEffector(new CMonsterEffector(m_scan_effector_info, m_scan_effector_time, m_scan_effector_time_attack, m_scan_effector_time_release)); } } } // check stop of scanning (it currently scans) else { if (!m_scan_sound._feedback()) { // stop here m_state_scanning = false; // count next scan time m_scan_next_time = time() + Random.randI(m_scan_delay_min,m_scan_delay_max); } } } //--------------------------------------------------------------------- // check all flames for (FLAME_ELEMS_IT it = m_flames.begin();it != m_flames.end();it++) { SFlameElement *elem = *it; // test switches to states switch(elem->state) { case ePrepare: // check if time_out if (elem->time_started + m_time_fire_delay < time()) select_state(elem,eFire); break; case eFire: if (elem->time_started + m_time_fire_play < time()) select_state(elem,eStop); else { // check if we need test hit to enemy if (elem->time_last_hit + m_hit_delay < time()) { // test hit collide::rq_result rq; if (Level().ObjectSpace.RayPick(elem->position, elem->target_dir, m_length, collide::rqtBoth, rq, NULL)) { if ((rq.O == elem->target_object) && (rq.range < m_length)) { float hit_value; hit_value = m_hit_value - m_hit_value * rq.range / m_length; NET_Packet P; SHit HS; HS.GenHeader (GE_HIT, elem->target_object->ID()); // u_EventGen (P,GE_HIT, element->target_object->ID()); HS.whoID = (m_object->ID()); // P.w_u16 (ID()); HS.weaponID = (m_object->ID()); // P.w_u16 (ID()); HS.dir = (elem->target_dir); // P.w_dir (element->target_dir); HS.power = (hit_value); // P.w_float (m_flame_hit_value); HS.boneID = (BI_NONE); // P.w_s16 (BI_NONE); HS.p_in_bone_space = (Fvector().set(0.f,0.f,0.f)); // P.w_vec3 (Fvector().set(0.f,0.f,0.f)); HS.impulse = (0.f); // P.w_float (0.f); HS.hit_type = (ALife::eHitTypeBurn); // P.w_u16 (u16(ALife::eHitTypeBurn)); HS.Write_Packet (P); m_object->u_EventSend (P); elem->time_last_hit = time(); } } } } break; case eStop: xr_delete(*it); break; } } // remove all flames in state stop // удалить все элементы, выполнение которых закончено m_flames.erase ( std::remove_if( m_flames.begin(), m_flames.end(), remove_predicate() ), m_flames.end() ); // check if we can create another flame if (m_object->g_Alive() && m_object->EnemyMan.get_enemy() && (m_flames.size() < m_count)) { // check aura radius and accessibility float dist = m_object->EnemyMan.get_enemy()->Position().distance_to(m_object->Position()); if ((dist < m_pmt_aura_radius) && m_object->control().path_builder().accessible(m_object->EnemyMan.get_enemy()->Position())) { // check timing if (m_time_flame_started + m_delay < time()) { create_flame(m_object->EnemyMan.get_enemy()); } } } }
void CStateManagerBloodsucker::execute () { u32 state_id = u32(-1); const CEntityAlive* enemy = object->EnemyMan.get_enemy(); if ( !object->is_drag_anim_jump() && !object->is_animated() ) { if ( enemy ) { if ( check_state(eStateCustom_Vampire) ) { state_id = eStateCustom_Vampire; } else { switch ( object->EnemyMan.get_danger_type() ) { case eStrong: state_id = eStatePanic; break; case eWeak: state_id = eStateAttack; break; } } } else if ( object->HitMemory.is_hit() ) { state_id = eStateHitted; } else if ( object->hear_interesting_sound ) { state_id = eStateHearInterestingSound; } else { if ( can_eat() ) state_id = eStateEat; else state_id = eStateRest; } /////////////////////////////////////////////////////////////////////////////// // Additional /////////////////////////////////////////////////////////////////////////////// // check if start interesting sound state // if ( (prev_substate != eStateHearInterestingSound) && (state_id == eStateHearInterestingSound) ) // { // object->start_invisible_predator(); // } // else // // check if stop interesting sound state // if ( (prev_substate == eStateHearInterestingSound) && (state_id != eStateHearInterestingSound) ) // { // object->stop_invisible_predator(); // } select_state(state_id); // выполнить текущее состояние get_state_current()->execute(); prev_substate = current_substate; } else { state_id = eStateCustom; if ( object->is_drag_anim_jump() ) { select_state(state_id); // выполнить текущее состояние get_state_current()->execute(); prev_substate = current_substate; drag_object(); } } }