⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 naga.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ----------------------------------------------------------------------- //

void Naga::MC_Fire_Stand()
{
    if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FIRE_STAND)
    {
		if (m_nState == STATE_AttackFar)
		{
			if (m_fStimuli[SIGHT] > 0.0f && IsRandomChance(50))
			{
				m_InventoryMgr.ChangeWeapon(WEAP_NAGA_EYEBEAM);
				DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
			}
			else
			{
				m_iCeilingWhomps++;

				if (m_iCeilingWhomps > NAGA_MAX_WHOMPS)
				{
					// Too many whomps, we use the eye beam for variety.
					m_iCeilingWhomps = 0;

					m_InventoryMgr.ChangeWeapon(WEAP_NAGA_EYEBEAM);
					DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
				}
				else
				{
					m_InventoryMgr.ChangeWeapon(WEAP_NAGA_DEBRIS);
					DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_MELEE]);
				}
			}

		} else
		{
			if (IsRandomChance(25))
			{
				m_InventoryMgr.ChangeWeapon(WEAP_NAGA_EYEBEAM);
				DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
			}
			else
			{
				m_InventoryMgr.ChangeWeapon(WEAP_NAGA_SPIKE);
				DBOOL bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_MAGIC]);			
			}
		}

        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;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: Naga::AI_STATE_AttackClose
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void Naga::AI_STATE_AttackClose()
{
	//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;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: Naga::AI_STATE_AttackFar
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

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;
}

void Naga::SetNewState(int nState)
{
	DDWORD dwFlags;

	// Hide the spike, just in case
	dwFlags = m_pServerDE->GetObjectFlags(m_hSpike);
	dwFlags &= ~FLAG_VISIBLE;
	m_pServerDE->SetObjectFlags(m_hSpike, dwFlags);

	AI_Mgr::SetNewState(nState);	
}

DBOOL Naga::Fire(DBOOL bAltFire)
{
	DVector vPos, vDir;
	DRotation rRot;

	// Sanity check (GK 9/18/98)
	if (!m_InventoryMgr.GetCurrentWeapon())
		return DFALSE;

	switch(m_InventoryMgr.GetCurrentWeapon()->GetType())
	{
		case WEAP_NAGA_EYEBEAM:
		{
			m_pServerDE->GetModelNodeTransform(m_hObject,"head_gun",&vPos,&rRot);
			VEC_SUB(vDir, m_vTargetPos, vPos);
			break;
		}

		case WEAP_NAGA_SPIKE:
		{
			m_pServerDE->GetModelNodeTransform(m_hObject,"l_gun",&vPos,&rRot);
			VEC_SUB(vDir, m_vTargetPos, vPos);
			break;
		}

		default:
		{	
			m_pServerDE->GetObjectPos(m_hObject,&vPos);
			VEC_SUB(vDir, m_vTargetPos, vPos);
			break;
		}
	}

	VEC_NORM(vDir);
	m_pServerDE->AlignRotation(&rRot, &vDir, DNULL);

	m_InventoryMgr.FireCurrentWeapon(&vPos, &rRot, bAltFire);
	return DTRUE;
}

void Naga::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{

	DVector vCol;
	DFLOAT fAlpha;

	m_pServerDE->GetObjectColor(m_hObject, &vCol.x,&vCol.y,&vCol.z,&fAlpha);

	m_pServerDE->WriteToMessageDWord(hWrite, (DDWORD)m_iCeilingWhomps);
	m_pServerDE->WriteToMessageObject(hWrite, m_hSpike);
	m_pServerDE->WriteToMessageFloat(hWrite, m_fFullHealth);

	m_pServerDE->WriteToMessageFloat(hWrite, fAlpha);
}

void Naga::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
	DVector vCol;
	DFLOAT fAlpha;

	m_iCeilingWhomps = (int)(m_pServerDE->ReadFromMessageFloat(hRead));
	m_hSpike = m_pServerDE->ReadFromMessageObject(hRead);
	m_fFullHealth = m_pServerDE->ReadFromMessageFloat(hRead);

	m_pServerDE->GetObjectColor(m_hObject, &vCol.x,&vCol.y,&vCol.z, &fAlpha);
	fAlpha = m_pServerDE->ReadFromMessageFloat(hRead);
	m_pServerDE->SetObjectColor(m_hObject, vCol.x,vCol.y,vCol.z,fAlpha);
}


void Naga::MC_FadeIn()
{
    if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FADEIN)
    {        
		m_bAnimating = DTRUE; 
		m_nCurMetacmd = MC_FADEIN;

		DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
		dwFlags = dwFlags | FLAG_SOLID;
		m_pServerDE->SetObjectFlags(m_hObject,dwFlags);
    }
    else
	{
		DVector vColor;
		DFLOAT fAlpha = 0.0f;

		m_pServerDE->GetObjectColor(m_hObject,&vColor.x, &vColor.y, &vColor.z, &fAlpha);

		fAlpha += 1.0/64;
		if(fAlpha >= 1.0f)
			fAlpha = 1.0f;

		m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, fAlpha);

		if(fAlpha >= 1.0f)
		{
			m_bAnimating = DFALSE;
			Metacmd++;
			return;
		}
    }      
	
    return;	
}

void Naga::MC_Dead()
{
    if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_DEAD)
    {        
		DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
		dwFlags &= ~FLAG_SOLID;
		m_pServerDE->SetObjectFlags(m_hObject,dwFlags);

		m_bAnimating = DTRUE; 
		m_nCurMetacmd = MC_DEAD;
    }
    else
	{
		DVector vColor;
		DFLOAT fAlpha = 1.0f;

		m_pServerDE->GetObjectColor(m_hObject,&vColor.x, &vColor.y, &vColor.z, &fAlpha);

		fAlpha -= 1.0/64;
		if(fAlpha <= 0.0f)
		{
			fAlpha = 0.0f;

			DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
			dwFlags &= ~FLAG_VISIBLE;
			m_pServerDE->SetObjectFlags(m_hObject, dwFlags);
		}

		m_pServerDE->SetObjectColor(m_hObject,vColor.x,vColor.y,vColor.z, fAlpha);

		if(fAlpha <= 0.0f)
		{
			m_bAnimating = DFALSE;
			Metacmd++;
			return;
		}
    }      
	
    return;	
}

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;
	}
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CacheFiles
//
//	PURPOSE:	Cache resources used by the object
//
// ----------------------------------------------------------------------- //

void Naga::CacheFiles()
{
	// Sanity checks...

	CServerDE* pServerDE = GetServerDE();
	if (!pServerDE) return;

	if(!(pServerDE->GetServerFlags() & SS_CACHING))
	{
		return;
	}

	if (!m_hObject) return;


	// Get the model filenames...

	char sModel[256] = { "" };
	char sSkin[256]  = { "" };

	pServerDE->GetModelFilenames(m_hObject, sModel, 255, sSkin, 255);


	// Cache models...

	pServerDE->CacheFile(FT_MODEL, sModel);


	// Cache textures...

	pServerDE->CacheFile(FT_TEXTURE, sSkin);


	// Cache sounds...

	SetCacheDirectory("sounds\\enemies\\naga");

	CacheSoundFileRange("na_attack_", 1, 3);
	CacheSoundFileRange("na_beam_", 1, 3);
	CacheSoundFileRange("na_death_", 1, 3);
	CacheSoundFileRange("na_howl_", 1, 3);
	CacheSoundFileRange("na_idle_", 1, 3);
	CacheSoundFileRange("na_pain_", 1, 3);
	CacheSoundFileRange("na_taunt_", 1, 3);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -