Пример #1
0
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;
}
Пример #3
0
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;
}
Пример #5
0
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);
  }
}
Пример #6
0
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();
	}
}
Пример #7
0
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();
}
Пример #8
0
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());
			}
		}
	}

	

}
Пример #9
0
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();
		}
	}	
}