コード例 #1
0
ファイル: PathFinder.cpp プロジェクト: MaliusArth/PixelArth
	virtual bool Update( PathFinderMove& /*move*/ )
	{
		//Make sure we can keep heading to our current subgoal
		const Vector2List& currentPath = GetCurrentPath();
		int currentPathIndex = GetCurrentPathIndex();

		//has the destination changed
		Vector2 vDest = currentPath[currentPath.size()-1];
		if( vDest == GetCurrentDestination() )
		{
			if( theSpatialGraph.CanGo( GetCurrentPosition(), currentPath[currentPathIndex] ) )
			{
				SetNewState( PathFinder::PFMS_FOLLOW );
				return true;
			}
			else if( !theSpatialGraph.CanGo( GetCurrentPosition(), GetCurrentPosition() ) )
			{
				//are we blocked
				SetNewState( PathFinder::PFMS_RECOVER );
				return true;
			}
		}

		//otherwise, try again
		SetNewState( PathFinder::PFMS_START );
		return true;
	}
コード例 #2
0
ファイル: CivilianAI.cpp プロジェクト: Arc0re/lithtech
void CivilianAI::ComputeState(int nStimType)
{
	int nStim = nStimType;

	if(nStimType == -1)
		nStim = ComputeStimuli();

	if(!nStim)
	{
		SetNewState(StateStrToInt(m_szAIState));
	}
	else
	{
		if(m_nState == STATE_Escape_Hide)
		{
			SetNewState(STATE_Escape_Hide);
		}
		else if(m_bScared || (m_fStimuli[HEALTH] < 1.0f))
		{
			m_bScared = DTRUE;
			SetNewState(STATE_Escape_RunAway);
		}
		else
			SetNewState(StateStrToInt(m_szAIState));
	}

	return;
}
コード例 #3
0
ファイル: PathFinder.cpp プロジェクト: MaliusArth/PixelArth
	virtual bool Update( PathFinderMove& move )
	{
		if( !theSpatialGraph.IsInPathableSpace( GetCurrentPosition() ) )
		{
			SetNewState(PathFinder::PFMS_STARTRECOVER);
			return true;
		}
		//find path
		GetCurrentPath().clear();
		bool retVal = theSpatialGraph.GetPath( GetCurrentPosition(), GetCurrentDestination(), GetCurrentPath() );

		if( retVal )
		{
			move.LastResult = PathFinder::PFMR_PATH_FOUND;
			//Initialize path index
			GetCurrentPathIndex() = 0;

			SetNewState( PathFinder::PFMS_FOLLOW );
			//Keep ticking
			return true;
		}
		else
		{
			move.LastResult = PathFinder::PFMR_PATH_NOT_FOUND;
		}

		//We're done if path failed
		return false;
	}
コード例 #4
0
ファイル: OpheliaREV.cpp プロジェクト: Arc0re/lithtech
void OpheliaREV::MC_BestWeapon()
{
	CWeapon* pW	= m_InventoryMgr.GetCurrentWeapon();

	if(pW == DNULL)
	{
		SetNewState(STATE_Idle);
		return;
	}

    if (m_bAnimating == DFALSE)
    {
		if(pW)
		{
			if(m_InventoryMgr.GetAmmoCount(pW->GetAmmoType(DFALSE)) <= 0.0)
			{
				SetAnimation( m_pAnim_Sound->m_nAnim_SWITCH_WEAPON[pW->GetFireType()]);

				m_pServerDE->SetModelLooping(m_hObject, DFALSE);

				m_bAnimating = DTRUE;
			}
			else
			{
				m_bAnimating = DFALSE;
				Metacmd++;
			}
		}
	}
	else
	{
		//Are we done?
		if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
        {
			if(pW->GetType() == WEAP_TESLACANNON)
			{
				m_InventoryMgr.ChangeWeapon(WEAP_SNIPERRIFLE);
				pW = m_InventoryMgr.GetCurrentWeapon();
				pW->ShowHandModel(DFALSE);
				SetAnimation( m_pAnim_Sound->m_nAnim_SWITCH_WEAPON[pW->GetFireType()]);
			}
			else
			{
				if(m_InventoryMgr.GetAmmoCount(pW->GetAmmoType(DFALSE)) <= 0.0)
				{
					SetNewState(STATE_FindAmmo);
				}
				else
				{
					m_bAnimating = DFALSE;
					Metacmd++;
				}
			}
        }
	}

	return;
}
コード例 #5
0
ファイル: CivilianAI.cpp プロジェクト: Arc0re/lithtech
DDWORD CivilianAI::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
	switch(messageID)
	{
 		case MID_TRIGGER:
		{
			HSTRING hMsg = m_pServerDE->ReadFromMessageHString(hRead);
			char *pCommand = m_pServerDE->GetStringData(hMsg);

			/* 01/15/1999 Be VERY sure we should run this. -- Loki */
			if ((m_nState != STATE_Escape_Hide) && 
				(m_nState != STATE_Script) && 
				(m_nState != STATE_Special1) &&
				(m_nState != STATE_Special2) &&
				(m_nState != STATE_Special3) &&
				(m_nState != STATE_Special4) &&
				(m_nState != STATE_Special5) &&
				(m_nState != STATE_Special6) &&
				(m_nState != STATE_Special7) &&
				(m_nState != STATE_Special8) &&
				(m_nState != STATE_Special9) &&
				(_mbscmp((const unsigned char*)pCommand, (const unsigned char*)"TRIGGER") == 0))
			{
				m_hTarget = hSender;

				if(m_bLabTech)
					SetNewState(STATE_Escape_Hide);
				else
					SetNewState(STATE_Special1);
			}

			g_pServerDE->FreeString( hMsg );

			break;
		}

		case MID_DAMAGE:
		{
			AI_Mgr::ObjectMessageFn(hSender, messageID, hRead);
			SetNewState(STATE_Escape_RunAway);

			return 0;
		}

		default : break;
	}

	return AI_Mgr::ObjectMessageFn(hSender, messageID, hRead);
}
コード例 #6
0
ファイル: bug.cpp プロジェクト: Arc0re/lithtech
void BugAI::AI_STATE_Escape_RunAway()
{
	//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
	if(m_hTarget == DNULL)
	{
		SetNewState(STATE_Idle);
		return;
	}

	switch(Metacmd)
	{
		case 1:		char szSound[256];
					_mbscpy((unsigned char*)szSound, (const unsigned char*)SOUND_FEAR);
					m_pAnim_Sound->GetSoundPath(szSound,m_pServerDE->IntRandom(1,NUM_BUG_FEAR));

					PlayAISound(szSound, 1000.0f);					

					Metacmd++;			break;
		case 2:		MC_FaceTarget();							break;
		case 3:		m_fRadsLeft = 3.14f;	Metacmd++;			break;
		case 4:		MC_Turn();									break;
		case 5:		MC_Run();									break;
		case 6:		ComputeState();								break;
	}

	return;
}
コード例 #7
0
ファイル: bug.cpp プロジェクト: Arc0re/lithtech
void BugAI::AI_STATE_Idle()
{
	if(ComputeStimuli())
	{
		ComputeState();
		m_pServerDE->SetNextUpdate(m_hObject,0.1f);
		return;
	}
	else
		m_pServerDE->SetNextUpdate(m_hObject,0.2f);

	switch(Metacmd)
	{
		case 1:		char szSound[256];
					_mbscpy((unsigned char*)szSound, (const unsigned char*)SOUND_IDLE);
					m_pAnim_Sound->GetSoundPath(szSound,m_pServerDE->IntRandom(1,NUM_BUG_IDLE));

					PlayAISound(szSound, 1000.0f);					

					Metacmd++;			break;
		case 2:		MC_Idle();						break;
		case 3:		m_fRadsLeft = m_pServerDE->Random(-1.56f,1.56f);	
					Metacmd++;						break;
		case 4:		MC_Turn();						break;
		case 5:		MC_Run();						break;
		case 6:		SetNewState(STATE_Idle);		break;
	}

	return;
}
コード例 #8
0
ファイル: DeathShroud.cpp プロジェクト: Arc0re/lithtech
void DeathShroud::MC_Fire_Stand()
{
    if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FIRE_STAND)
    {
	    DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[8]);

		//SCHLEGZ 4/22/98 3:27:12 PM: if we can't stand up, crawl out from underneath
		if(!bRet)
		{
			SetNewState(STATE_CrawlUnderObj);
			return;
		}

        m_pServerDE->SetModelLooping(m_hObject, DFALSE);
        
		m_bAnimating = DTRUE; 
		m_nCurMetacmd = MC_FIRE_STAND;
    }
    else
	{
		if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)		
		{
			m_bAnimating = DFALSE;
			Metacmd++;
			return;
		}
    }      
	
    return;
}
コード例 #9
0
ファイル: prophet.cpp プロジェクト: jordandavidson/lithtech
DBOOL Prophet::Fire(DBOOL bAltFire)
{
    DBOOL bFire = DFALSE;
    CWeapon* pW = m_InventoryMgr.GetCurrentWeapon();

    if(pW == DNULL)
    {
        SetNewState(STATE_Idle);
        return DFALSE;
    }

    DVector vTargetVel, vVel;
    m_pServerDE->GetVelocity(m_hTarget, &vTargetVel);
    m_pServerDE->GetVelocity(m_hObject, &vVel);

    DFLOAT fTargetVel = VEC_MAG(vTargetVel);
    DFLOAT fVel = VEC_MAG(vVel);

    if(fTargetVel <= 5.0f && fVel <= 5.0f && pW->GetType() != WEAP_ASSAULTRIFLE
            && pW->GetType() != WEAP_NAPALMCANNON && pW->GetType() != WEAP_SNIPERRIFLE)
    {
        if(m_InventoryMgr.GetAmmoCount(pW->GetAmmoType(DFALSE)) >= pW->GetAltAmmoUse())
            bFire = DTRUE;
    }

//	DDWORD m_nFiredWeapon = m_InventoryMgr.FireCurrentWeapon(&m_MoveObj.GetPos(), &m_MoveObj.GetRotation(), bFire);

    return AI_Mgr::Fire(bFire);
}
コード例 #10
0
ファイル: prophet.cpp プロジェクト: jordandavidson/lithtech
void Prophet::MC_Fire_Stand()
{
    CWeapon* pW = m_InventoryMgr.GetCurrentWeapon();

    if(pW == DNULL)
    {
        SetNewState(STATE_Idle);
        return;
    }

    if(pW->GetType() == WEAP_MELEE)
    {
        if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FIRE_STAND)
        {
            DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[m_pServerDE->IntRandom(4,6)]);

            //SCHLEGZ 4/22/98 3:27:12 PM: if we can't stand up, crawl out from underneath
            if(!bRet)
            {
                SetNewState(STATE_CrawlUnderObj);
                return;
            }

            m_pServerDE->SetModelLooping(m_hObject, DFALSE);

            m_bAnimating = DTRUE;
            m_nCurMetacmd = MC_FIRE_STAND;
            m_pServerDE->SetNextUpdate(m_hObject, 0.1f);
        }
        else
        {
            if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)
            {
                m_bAnimating = DFALSE;
                Metacmd++;
                return;
            }
        }
    }
    else
    {
        AI_Mgr::MC_Fire_Stand();
    }

    return;
}
コード例 #11
0
ファイル: CultistAI.cpp プロジェクト: bsmr-games/Blood2
void CultistAI::AI_STATE_AttackFar()
{
	DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);

	//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
	if(m_hTarget == DNULL)
	{
		if(fHeight <= m_vDims.y)
			SetNewState(STATE_SearchVisualTarget);
		else
			ComputeState();

		return;
	}

	m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
	DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;

	switch(Metacmd)
	{
		case 1:		MC_FaceTarget();	break;
		case 2:		MC_BestWeapon();	break;
		case 3:		if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.75) || m_nCurMetacmd == MC_FIRE_STAND || fHeight > m_vDims.y)
					{
						MC_Fire_Stand();
					}
					else
						Metacmd++;

					break;
		case 4:		if(m_fStimuli[SIGHT] > (m_fSeeingDist * 0.75))
					{
						MC_FaceTarget();
						Metacmd--;

						if(!IsLedge(m_MoveObj.GetForwardVector()) && fHeight <= m_vDims.y
							&& m_nCurMetacmd != MC_FIRE_STAND
							)
						{
							if(m_nInjuredLeg)
								MC_Walk();
							else
								MC_Fire_Run();
						}
						else
						{
							MC_Fire_Stand();
						}
					}
					else
						Metacmd++;

					break;
		case 5:		ComputeState();		break;
	}

	return;
}
コード例 #12
0
ファイル: UndeadGideon.cpp プロジェクト: Arc0re/lithtech
void UndeadGideon::ComputeState(int nStimType)
{
	int nStim = nStimType;

	if(nStimType == -1)
		nStim = ComputeStimuli();

	DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);

	if(nStim == 0)
	{
		switch(m_nState)
		{
			case STATE_Idle:				SetNewState(STATE_Idle);			break;
			case STATE_SearchVisualTarget:	SetNewState(STATE_Idle);			break;
			case STATE_SearchSmellTarget:	SetNewState(STATE_Idle);			break;
			default:						SetNewState(STATE_SearchSmellTarget);	break;
		}
	}
	else
	{
		if(nStimType == STIM_SMELL)
			SetNewState(STATE_SearchSmellTarget);
		else if(m_fStimuli[SIGHT] <= 0.85f || fHeight > m_vDims.y)
			SetNewState(STATE_AttackFar);
		else
			SetNewState(STATE_AttackClose);
	}

	return;
}
コード例 #13
0
ファイル: Gremlin.cpp プロジェクト: bsmr-games/Blood2
void GremlinAI::ComputeState(int nStimType)
{
	int nStim = nStimType;

	if(nStimType == -1)
		nStim = ComputeStimuli();

	if(nStim == 0)
	{
		switch(m_nState)
		{
			case STATE_Idle:				SetNewState(STATE_Idle);			break;
			case STATE_SearchVisualTarget:	SetNewState(STATE_Idle);			break;
			case STATE_SearchSmellTarget:	SetNewState(STATE_Idle);			break;
			default:						SetNewState(STATE_SearchSmellTarget);	break;
		}
	}
	else
	{
		if(nStimType == STIM_SMELL)
			SetNewState(STATE_SearchSmellTarget);
		else if(m_fStimuli[SIGHT] <= 0.75f)
			SetNewState(STATE_AttackFar);
		else
			SetNewState(STATE_AttackClose);
	}

	return;
}
コード例 #14
0
ファイル: PathFinder.cpp プロジェクト: MaliusArth/PixelArth
	virtual bool Update( PathFinderMove& move )
	{
		//check our current path index
		const int iLookAheadCount = 3;

		const Vector2List& currentPath = GetCurrentPath();
		int nextPathIndex = GetCurrentPathIndex();

		//Are we at our goal index
		if( nextPathIndex == (int)currentPath.size() - 1 )
		{
			move.NextSubgoalPos = currentPath[nextPathIndex];
			//check distance to goal
			float sqDist = Vector2::DistanceSquared( GetCurrentPosition(), move.NextSubgoalPos );
			float arrivalDistSq = GetCurrentArrivalDist();
			arrivalDistSq *= arrivalDistSq;
			if( sqDist <= arrivalDistSq )
			{
				//don't set move dir (we've arrived)
				move.LastResult = PathFinder::PFMR_ARRIVED;
				SetNewState( PathFinder::PFMS_VALIDATE );
				return false;
			}
		}
		else
		{
			//otherwise, see if we can advance our next subgoal
			for( int i = 0 ; i < iLookAheadCount && (nextPathIndex+1) < (int)currentPath.size(); i++ )
			{
				if( theSpatialGraph.CanGo( GetCurrentPosition(), currentPath[nextPathIndex+1] ) )
				{
					++nextPathIndex;
				}
			}

			GetCurrentPathIndex() = nextPathIndex;
			move.NextSubgoalPos = currentPath[nextPathIndex];
		}

		//Move dir is normalized towards next subgoal
		move.MoveDir = Vector2::Normalize( move.NextSubgoalPos - GetCurrentPosition() );
		//we're done this round
		SetNewState( PathFinder::PFMS_VALIDATE );
		return false;
	}
コード例 #15
0
ファイル: MadScientistAI.cpp プロジェクト: bsmr-games/Blood2
void MadScientistAI::ComputeState(int nStimType)
{
	int nStim = nStimType;

	if(nStimType == -1)
		nStim = ComputeStimuli();

	if(nStim == 0)
	{
		SetNewState(StateStrToInt(m_szAIState));
	}
	else
	{
		SetNewState(STATE_Escape_Hide);
	}

	return;
}
コード例 #16
0
ファイル: UndeadGideon.cpp プロジェクト: Arc0re/lithtech
void UndeadGideon::AI_STATE_AttackFar()
{
	DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);

	//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
	if(m_hTarget == DNULL && m_nCurMetacmd != MC_FIRE_STAND && m_nCurMetacmd != MC_JUMP)
	{
		if(fHeight <= m_vDims.y)
			SetNewState(STATE_SearchVisualTarget);
		else
			ComputeState();

		return;
	}

	m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
	DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;
	
	MC_FaceTarget();
	Metacmd--;
					
	switch(Metacmd)
	{
		case 1:		if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.75) || m_nCurMetacmd == MC_FIRE_STAND 
						|| (bAbove && fHeight > m_vDims.y))
					{
						MC_Fire_Stand();
					}
					else
					{
						if(m_fStimuli[SIGHT] < (m_fSeeingDist * 0.20))
							ComputeState();
						else
							MC_Walk();		
					}
					
					break;
		case 2:		if((m_fStimuli[SIGHT] < (m_fSeeingDist * 0.20)) && m_nCurMetacmd != MC_JUMP
						|| (bAbove && fHeight > m_vDims.y))
					{
						ComputeState();
					}
					else if(m_fStimuli[SIGHT] < (m_fSeeingDist * 0.30) || m_nCurMetacmd == MC_JUMP
							|| IsLedge(m_MoveObj.GetForwardVector()))
					{
						MC_Jump();
					}
					else
						MC_Walk();		

					break;
		case 3:		ComputeState();					break;
	}

	return;
}
コード例 #17
0
ファイル: OpheliaREV.cpp プロジェクト: Arc0re/lithtech
void OpheliaREV::AI_STATE_Escape_Hide()
{
	switch(Metacmd)
	{
		case 1:		m_hTrackObject = FindObjectInRadius(m_pServerDE->GetClass("ExitHint"), m_fSeeingDist);

					if(m_hTrackObject)
					{
						m_pServerDE->GetObjectPos(m_hTrackObject,&m_vDestPos);
						SetNewState(STATE_RunToPos);
					}
					else
						SetNewState(STATE_AttackClose);
					
					break;
	}

	return;

}
コード例 #18
0
ファイル: DeathShroud.cpp プロジェクト: Arc0re/lithtech
void DeathShroud::ComputeState(int nStimType)
{
	int nStim = nStimType;

	if(nStimType == -1)
		nStim = ComputeStimuli();

	if(!nStim)
	{
		switch(m_nState)
		{
			case STATE_Idle:				SetNewState(STATE_Idle);			break;
			case STATE_SearchVisualTarget:	SetNewState(STATE_Idle);			break;
			case STATE_SearchSmellTarget:	SetNewState(STATE_Idle);			break;
			default:						SetNewState(STATE_SearchVisualTarget);	break;
		}
	}
	else
	{
		SetNewState(STATE_AttackFar);				
	}
	return;
}
コード例 #19
0
ファイル: prophet.cpp プロジェクト: jordandavidson/lithtech
void Prophet::AI_STATE_Escape_RunAway()
{
    DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);

    //SCHLEGZ 4/22/98 4:51:21 PM: sanity check
    if(m_hTarget == DNULL && m_nCurMetacmd != MC_FIRE_STAND)
    {
        if(fHeight <= m_vDims.y)
            SetNewState(STATE_SearchVisualTarget);
        else
            ComputeState();

        return;
    }

    switch(Metacmd)
    {
    case 1:
        MC_FaceTarget();
        m_InventoryMgr.ChangeWeapon(WEAP_MELEE);

        break;
    case 2:
        m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);

        if(m_fStimuli[SIGHT] <= 75.0f)
            MC_Fire_Stand();
        else
        {
            MC_FaceTarget();
            Metacmd--;

            if(!IsLedge(m_MoveObj.GetForwardVector()) && fHeight <= m_vDims.y)
            {
                MC_Run();
            }
            else
            {
                MC_Idle();
            }
        }

        break;
    case 3:
        ComputeState();
        break;
    }

    return;
}
コード例 #20
0
ファイル: Naga.cpp プロジェクト: Arc0re/lithtech
void Naga::AI_STATE_Special1()
{
	switch(Metacmd)
	{
		case 1:
			MC_FadeIn();
			break;

		case 2:
			DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
			dwFlags = dwFlags | FLAG_SOLID;
			m_pServerDE->SetObjectFlags(m_hObject, dwFlags);
			SetNewState(STATE_Idle);
			break;
	}
}
コード例 #21
0
ファイル: DeathShroud.cpp プロジェクト: Arc0re/lithtech
void DeathShroud::AI_STATE_AttackFar()
{
	DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);

	//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
	if(m_hTarget == DNULL && m_nCurMetacmd != MC_FIRE_STAND)
	{
		if(fHeight <= m_vDims.y)
			SetNewState(STATE_SearchVisualTarget);
		else
			ComputeState();

		return;
	}

	m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
	
	MC_FaceTarget();
	Metacmd--;

	switch(Metacmd)
	{
		case 1:		MC_Fade(DFALSE);	break;	
		case 2:		if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.66) || m_nCurMetacmd == MC_FIRE_STAND
						|| fHeight > m_vDims.y)
					{
						MC_Fire_Stand();
					}
					else
					{
						Metacmd++;
					}

					break;
		case 3:		MC_Fade(DTRUE);		break;
		case 4:		if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.33) || fHeight > m_vDims.y)
						Metacmd++;
					else
						MC_Walk();

					break;
		case 5:		ComputeState();		break;
	}

	return;
}
コード例 #22
0
ファイル: PathFinder.cpp プロジェクト: MaliusArth/PixelArth
	virtual bool Update( PathFinderMove& move )
	{
		//are we back in pathable space?
		if( theSpatialGraph.IsInPathableSpace( GetCurrentPosition() ) )
		{
			SetNewState( PathFinder::PFMS_FOLLOW );
			return true;
		}

		const Vector2List& currentPath = GetCurrentPath();
		int currentPathIndex = GetCurrentPathIndex();

		//otherwise, head toward our current pathnode
		move.MoveDir = Vector2::Normalize( currentPath[currentPathIndex] - GetCurrentPosition() );

		return false;
	}
コード例 #23
0
ファイル: Gremlin.cpp プロジェクト: bsmr-games/Blood2
void GremlinAI::MC_Fire_Stand()
{
    if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FIRE_STAND)
    {
        DBOOL bRet = DFALSE;
		DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);
		DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;

		if(m_nState == STATE_AttackFar || m_nState == STATE_GuardLocation || (bAbove && fHeight > m_vDims.y))
		{
			m_InventoryMgr.ChangeWeapon(WEAP_GREMLIN_ROCK);
	        bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[4]);
		}
		else
		{
			m_InventoryMgr.ChangeWeapon(WEAP_SHIKARI_CLAW);
	        bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[4]);
		}

		//SCHLEGZ 4/22/98 3:27:12 PM: if we can't stand up, crawl out from underneath
		if(!bRet)
		{
			SetNewState(STATE_CrawlUnderObj);
			return;
		}

        m_pServerDE->SetModelLooping(m_hObject, DFALSE);
        
		m_bAnimating = DTRUE; 
		m_nCurMetacmd = MC_FIRE_STAND;
    }
    else
	{
		if(m_pServerDE->GetModelPlaybackState(m_hObject) & MS_PLAYDONE)		
		{
			m_InventoryMgr.ChangeWeapon(WEAP_SHIKARI_CLAW);

			m_bAnimating = DFALSE;
			Metacmd++;
			return;
		}
    }      
	
    return;
}
コード例 #24
0
ファイル: Naga.cpp プロジェクト: Arc0re/lithtech
void Naga::AI_STATE_AttackFar()
{
	//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
	if(m_hTarget == DNULL && m_nCurMetacmd != MC_FIRE_STAND)
	{
		SetNewState(STATE_SearchVisualTarget);
		return;
	}

	switch(Metacmd)
	{
		case 1:		MC_FaceTarget();	break;
		case 2:		MC_Fire_Stand();	break;
		case 3:		ComputeState();		break;
	}

	return;
}
コード例 #25
0
ファイル: UndeadGideon.cpp プロジェクト: Arc0re/lithtech
void UndeadGideon::AI_STATE_Dodge()
{
	switch(Metacmd)
	{
		case 1:		m_nDodgeFlags = CalculateDodge(m_vTrackObjPos);
					Metacmd++;		break;
		case 2:		if(m_nDodgeFlags & RIGHT)
						MC_Dodge_Right();
					else if(m_nDodgeFlags & LEFT)
						MC_Dodge_Left();
					else
						Metacmd++;

					break;
		case 3:		SetNewState(STATE_Idle);	break;
	}

	return;
}
コード例 #26
0
ファイル: PathFinder.cpp プロジェクト: MaliusArth/PixelArth
	virtual bool Update( PathFinderMove& move )
	{
		//are we back in pathable space?
		if( theSpatialGraph.IsInPathableSpace( GetCurrentPosition() ) )
		{
			SetNewState( PathFinder::PFMS_START );
			return true;
		}

		//find the nearest non-blocked neighbor I can move to
		Vector2 vGoTo;
		if( theSpatialGraph.FindNearestNonBlocked( GetCurrentPosition(), vGoTo) )
		{
			move.MoveDir = Vector2::Normalize( vGoTo - GetCurrentPosition() );
		}
		else
		{
			move.LastResult = PathFinder::PFMR_PATH_NOT_FOUND;
		}

		return false;
	}
コード例 #27
0
ファイル: Naga.cpp プロジェクト: Arc0re/lithtech
void Naga::ComputeState(int nStimType)
{
	int nStim = nStimType;

	if(nStimType == -1)
		nStim = ComputeStimuli();

	if(!nStim)
	{
		switch(m_nState)
		{
			case STATE_Idle:				SetNewState(STATE_Idle);				break;
			case STATE_SearchVisualTarget:	SetNewState(STATE_Idle);				break;
			default:						SetNewState(STATE_SearchVisualTarget);	break;
		}
	}
	else
	{
		if(m_fStimuli[SENSE] > 0.0f && m_fStimuli[SIGHT] <= 0.0f)
		{
			SetNewState(STATE_AttackFar);
			return;
		}

		//if health is low or threat is high, attack close
		if(m_fStimuli[HEALTH] < 0.25f || m_fStimuli[THREAT] > 0.75f)
		{
			SetNewState(STATE_AttackClose);
			return;
		}

		if(m_fStimuli[SIGHT] > 0.85f)
			SetNewState(STATE_AttackClose);
		else
			SetNewState(STATE_AttackFar);
	}

	return;
}
コード例 #28
0
ファイル: CivilianAI.cpp プロジェクト: Arc0re/lithtech
void CivilianAI::AI_STATE_Escape_RunAway()
{
	DVector vDims;
	m_pServerDE->GetObjectDims(m_hObject,&vDims);
	DFLOAT fDim = (DFLOAT)sqrt((vDims.x * vDims.x) + (vDims.z * vDims.z)) + 0.1f;

	switch(Metacmd)
	{
		case 1:		
		{
					m_hTrackObject = FindObjectInRadius(m_pServerDE->GetClass("ExitHint"), m_fSeeingDist, FIND_VISIBLE);

					if(m_hTrackObject)
					{
						m_pServerDE->GetObjectPos(m_hTrackObject,&m_vTrackObjPos);

						DFLOAT fDist = VEC_DIST(m_vTrackObjPos, m_MoveObj.GetPos());
						
						if(fDist <= fDim/2)
						{
							SetNewState(STATE_Escape_Hide);
							break;
						}

						MC_FacePos(m_vTrackObjPos);

						DRotation rRot;
						DVector vU, vR, vF, vMyF;

						m_pServerDE->GetObjectRotation(m_hTrackObject, &rRot);
						m_pServerDE->GetRotationVectors(&rRot, &vU, &vR, &vF);

						VEC_COPY(vMyF, m_MoveObj.GetForwardVector());

						DFLOAT fHintDp = (vMyF.x * vF.x) + (vMyF.y * vF.y) + (vMyF.z * vF.z);

						if(fHintDp > 0)
						{					
							if(!m_MoveObj.CalculatePath(m_vTrackObjPos))
								SetNewState(STATE_Escape_Hide);
						}
						else
							SetNewState(STATE_Escape_Hide);
					}
					else
						SetNewState(STATE_Escape_Hide);
					
					break;
		}
		case 2:	
		{
					DVector* pvPos = m_MoveObj.GetNextPathPoint();
					
					if(pvPos)
						MC_FacePos(*pvPos);	
					else
						SetNewState(STATE_Escape_RunAway);

					break;
		}
		case 3:		
		{
					DVector vPoint = *m_MoveObj.GetNextPathPoint();
					vPoint.y = m_MoveObj.GetPos().y;

					if(VEC_DIST(vPoint, m_MoveObj.GetPos()) <= fDim/2)
					{
						if(!m_MoveObj.MoveToNextPathPoint())
						{
							MC_FacePos(m_vTargetPos);
						}
						else
						{
							Metacmd = 2;
						}
					}
					else
						MC_Run();

					break;
		}
		case 4:		ComputeState();			break;
	}

	return;
}
コード例 #29
0
ファイル: OpheliaREV.cpp プロジェクト: Arc0re/lithtech
void OpheliaREV::AI_STATE_AttackFar()
{
	DFLOAT fHeight = (DFLOAT)fabs(m_vTargetPos.y - m_MoveObj.GetPos().y);

	//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
	if(m_hTarget == DNULL)
	{
		if(fHeight <= m_vDims.y)
			SetNewState(STATE_SearchVisualTarget);
		else
			ComputeState();

		return;
	}

	m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
	DBOOL bAbove = (m_vTargetPos.y - m_MoveObj.GetPos().y) > 0;
	
	CWeapon* pW = m_InventoryMgr.GetCurrentWeapon();

	if(pW == DNULL)
	{
		SetNewState(STATE_Idle);
		return;
	}

	switch(Metacmd)
	{
		case 1:		MC_FaceTarget();	break;
		case 2:		MC_BestWeapon();	break;
		case 3:		if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.75) || m_nCurMetacmd == MC_FIRE_STAND
						|| m_nCurMetacmd == MC_FIRE_CROUCH || fHeight > m_vDims.y)
					{
						if((fHeight > m_vDims.y && !bAbove) || m_nCurMetacmd == MC_FIRE_CROUCH
							|| m_fStimuli[HEALTH] < 0.5f || pW->GetType() == WEAP_SNIPERRIFLE)
						{
							MC_Fire_Crouch();
						}
						else
						{
							MC_Fire_Stand();
						}
					}
					else
						Metacmd++;

					break;
		case 4:		if(m_fStimuli[SIGHT] > (m_fSeeingDist * 0.75))
					{
						MC_FaceTarget();
						Metacmd--;

						if(!IsLedge(m_MoveObj.GetForwardVector()) && fHeight <= m_vDims.y
							&& m_nCurMetacmd != MC_FIRE_CROUCH && pW->GetType() != WEAP_SNIPERRIFLE)
						{
							if(m_nInjuredLeg)
								MC_Walk();
							else
								MC_Fire_Run();
						}
						else
						{
							MC_Fire_Crouch();
						}
					}
					else
						Metacmd++;

					break;
		case 5:		ComputeState();		break;
	}

	return;
}
コード例 #30
0
ファイル: OpheliaREV.cpp プロジェクト: Arc0re/lithtech
void OpheliaREV::AI_STATE_Escape_RunAway()
{
	if(Metacmd > 1)
	{
		int nStimType = ComputeStimuli();

		if(nStimType > 0)
		{
			ComputeState(nStimType);
			return;
		}
	}

	DFLOAT fDim = (DFLOAT)sqrt((m_vDims.x * m_vDims.x) + (m_vDims.z * m_vDims.z)) + 0.1f;

	switch(Metacmd)
	{
		case 1:		m_hTrackObject = FindObjectInRadius(m_pServerDE->GetClass("ExitHint"), m_fSeeingDist, FIND_VISIBLE | FIND_AVOID_TARGET);

					if(m_hTrackObject)
					{
						m_pServerDE->GetObjectPos(m_hTrackObject,&m_vTrackObjPos);

						MC_FacePos(m_vTrackObjPos);

						if(!m_MoveObj.CalculatePath(m_vTrackObjPos))
							SetNewState(STATE_Idle);
					}
					else
						SetNewState(STATE_AttackFar);
					
					break;
		case 2:	
		{
					DVector* pvPos = m_MoveObj.GetNextPathPoint();
					
					if(pvPos)
						MC_FacePos(*pvPos);	
					else
						SetNewState(STATE_Escape_RunAway);

					break;
		}
		case 3:		
		{
					DVector vPoint = *m_MoveObj.GetNextPathPoint();
					vPoint.y = m_MoveObj.GetPos().y;

					if(VEC_DIST(vPoint, m_MoveObj.GetPos()) <= fDim/2)
					{
						if(!m_MoveObj.MoveToNextPathPoint())
						{
							MC_FacePos(m_vTargetPos);
						}
						else
						{
							Metacmd = 2;
						}
					}
					else
						MC_Run();

					break;
		}
		case 4:		ComputeState();			break;
	}

	return;}