Ejemplo n.º 1
0
bool CAI_Stalker::useful		(const CItemManager *manager, const CGameObject *object) const
{
	const CExplosive	*explosive = smart_cast<const CExplosive*>(object);

	if (explosive && smart_cast<const CInventoryItem*>(object))
		agent_manager().location().add	(xr_new<CDangerObjectLocation>(object,Device.dwTimeGlobal,DANGER_INFINITE_INTERVAL,DANGER_EXPLOSIVE_DISTANCE));

	if (explosive && (explosive->CurrentParentID() != 0xffff)) {
		agent_manager().explosive().register_explosive(explosive,object);
		CEntityAlive			*entity_alive = smart_cast<CEntityAlive*>(Level().Objects.net_Find(explosive->CurrentParentID()));
		if (entity_alive)
			memory().danger().add(CDangerObject(entity_alive,object->Position(),Device.dwTimeGlobal,CDangerObject::eDangerTypeGrenade,CDangerObject::eDangerPerceiveTypeVisual,object));
	}

	if (!memory().item().useful(object))
		return			(false);

	const CInventoryItem *inventory_item = smart_cast<const CInventoryItem*>(object);
	if (!inventory_item || !inventory_item->useful_for_NPC())
		return			(false);

	const CBolt			*bolt = smart_cast<const CBolt*>(object);
	if (bolt)
		return			(false);

	CInventory			*inventory_non_const = const_cast<CInventory*>(&inventory());
	CInventoryItem		*inventory_item_non_const = const_cast<CInventoryItem*>(inventory_item);
	if (!inventory_non_const->CanTakeItem(inventory_item_non_const))
		return			(false);

	return				(true);
}
Ejemplo n.º 2
0
const CCoverPoint *CAI_Stalker::best_cover			(const Fvector &position_to_cover_from)
{
//	shared_str const					&cover_id = movement().current_params().cover_id();
//	if (cover_id != "")
//		return							(ai().cover_manager().smart_cover(cover_id));

	update_best_cover_actuality			(position_to_cover_from);

	if (m_best_cover_actual) {
		agent_manager().member().member(this).cover(m_best_cover);
		return							(m_best_cover);
	}

	m_best_cover_actual					= true;
	
	const CCoverPoint					*best_cover = find_best_cover(position_to_cover_from);
	if (best_cover != m_best_cover) {
		on_best_cover_changed			(best_cover,m_best_cover);
		m_best_cover					= best_cover;
		m_best_cover_advance_cover		= 0;
		m_best_cover_can_try_advance	= false;
	}

	m_best_cover_value					= m_best_cover ? best_cover_value(position_to_cover_from) : flt_max;

	agent_manager().member().member(this).cover(m_best_cover);

	return								(m_best_cover);
}
Ejemplo n.º 3
0
bool CAI_Stalker::useful		(const CEnemyManager *manager, const CEntityAlive *object) const
{
	if (!agent_manager().enemy().useful_enemy(object,this))
		return			(false);

	return				(memory().enemy().useful(object));
}
Ejemplo n.º 4
0
void CAI_Stalker::react_on_member_death	()
{
	CMemberOrder::CMemberDeathReaction	&reaction = agent_manager().member().member(this).member_death_reaction();
	if (!reaction.m_processing)
		return;

	if (Device.dwTimeGlobal < reaction.m_time + TOLLS_INTERVAL)
		return;

	if (agent_manager().member().group_behaviour()) {
		if (!reaction.m_member->g_Alive())
			sound().play		( StalkerSpace::eStalkerSoundTolls, 3000, 2000 );
		else
			sound().play		( StalkerSpace::eStalkerSoundWounded, 3000, 2000 );
	}

	reaction.clear				();
}
Ejemplo n.º 5
0
void CAI_Stalker::react_on_grenades		()
{
	CMemberOrder::CGrenadeReaction	&reaction = agent_manager().member().member(this).grenade_reaction();
	if (!reaction.m_processing)
		return;

	if (Device.dwTimeGlobal < reaction.m_time + GRENADE_INTERVAL)
		return;

//	u32							interval = AFTER_GRENADE_DESTROYED_INTERVAL;
	const CMissile				*missile = smart_cast<const CMissile*>(reaction.m_grenade);
//	if (missile && (missile->destroy_time() > Device.dwTimeGlobal))
//		interval				= missile->destroy_time() - Device.dwTimeGlobal + AFTER_GRENADE_DESTROYED_INTERVAL;
//	m_object->agent_manager().add_danger_location(reaction.m_game_object->Position(),Device.dwTimeGlobal,interval,GRENADE_RADIUS);

	if (missile && agent_manager().member().group_behaviour()) {
//		Msg						("%6d : Stalker %s : grenade reaction",Device.dwTimeGlobal,*m_object->cName());
		CEntityAlive			*initiator = smart_cast<CEntityAlive*>(Level().Objects.net_Find(reaction.m_grenade->CurrentParentID()));
/*		VERIFY2					(
			initiator,
			make_string(
				"grenade[%d][%s], parent[%d]",
				missile->ID(),
				missile->cName().c_str(),
				reaction.m_grenade->CurrentParentID()
			)
		);
*/
		if (initiator) {
			if (is_relation_enemy(initiator))
				sound().play		(StalkerSpace::eStalkerSoundGrenadeAlarm);
			else
				if (missile->Position().distance_to(Position()) < FRIENDLY_GRENADE_ALARM_DIST) {
					u32 const time	= missile->destroy_time() >= Device.dwTimeGlobal ? u32(missile->destroy_time() - Device.dwTimeGlobal) : 0;
					sound().play	( StalkerSpace::eStalkerSoundFriendlyGrenadeAlarm, time + 1500, time + 1000 );
				}
		}
	}

	reaction.clear				();
}