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

📄 gideon.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
			}
		}
		else
		{
			if (IsRandomChance(50))
			{
				m_InventoryMgr.ChangeWeapon(WEAP_GIDEON_WIND);
				bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
			}
			else
			{
				m_InventoryMgr.ChangeWeapon(WEAP_NAGA_EYEBEAM);
				bRet = SetAnimation(m_pAnim_Sound->m_nAnim_FIRE_STAND[TYPE_RIFLE]);
			}
		}

        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_SOUL_HOOK);
			m_bAnimating = DFALSE;
			Metacmd++;
			return;
		}
    }      
	
    return;
}

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

void Gideon::AI_STATE_AttackClose()
{
	//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
	if(m_hTarget == DNULL)
	{
		SetNewState(STATE_SearchVisualTarget);
		return;
	}

	switch(Metacmd)
	{
		case 1:		MC_FaceTarget();	break;
		case 2:		m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);

					if((m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.90f)) || m_nCurMetacmd == MC_FIRE_STAND)
						MC_Fire_Stand();
					else
					{
						MC_FaceTarget();
						Metacmd--;

						if(m_fStimuli[SIGHT] > (m_fSeeingDist * 0.40))
						{
							SetNewState(STATE_Special1);		
						}
						else
						{
							MC_Walk();
						}
					}
					
					break;
		case 3:		if(m_nCurMetacmd == MC_DODGE_RIGHT)
						MC_Dodge_Right();
					else if(m_nCurMetacmd == MC_DODGE_LEFT)
						MC_Dodge_Left();
					else if(IsRandomChance(50))
						MC_Dodge_Right();
					else
						MC_Dodge_Left();

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

	return;
}

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

void Gideon::AI_STATE_AttackFar()
{
	//SCHLEGZ 4/22/98 4:51:21 PM: sanity check
	if(m_hTarget == DNULL)
	{
		SetNewState(STATE_SearchVisualTarget);
		return;
	}

	m_fStimuli[SIGHT] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);
						
	switch(Metacmd)
	{
		case 1:		MC_FaceTarget();
					Metacmd--;

					if((m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.30f)) || m_nCurMetacmd == MC_FIRE_STAND)
					{
						MC_Fire_Stand();
					}
					else
					{
						SetNewState(STATE_Special1);
					}
					
					break;
		case 2:		MC_Taunt_Bold();			break;
		case 3:		MC_FaceTarget();
					Metacmd--;
		
					if(m_fStimuli[SIGHT] <= (m_fSeeingDist * 0.40f))
					{
						SetNewState(STATE_Special1);
					}
					else
					{
						MC_Walk();
					}


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

	return;
}


void Gideon::MagicPowerup()
{
	DVector		offset;
	VEC_SET(offset, 0.0f, 0.0f, 0.0f);

	// Display the 'powerup' effect around Gideon
	HMESSAGEWRITE hMessage = m_pServerDE->StartInstantSpecialEffectMessage(&offset);
	m_pServerDE->WriteToMessageByte(hMessage, SFX_OBJECTFX_ID);

	m_pServerDE->WriteToMessageObject(hMessage, m_hObject);
	m_pServerDE->WriteToMessageVector(hMessage, &offset);
	m_pServerDE->WriteToMessageFloat(hMessage, 0.0f);
	m_pServerDE->WriteToMessageDWord(hMessage, 0);
	m_pServerDE->WriteToMessageDWord(hMessage, OBJFX_POWERUP_1);
	m_pServerDE->WriteToMessageDWord(hMessage, 0);

	m_pServerDE->EndMessage(hMessage);	
}

void Gideon::MC_FadeOut()
{
    if (m_bAnimating == DFALSE || m_nCurMetacmd != MC_FADEOUT)
    {        
		m_bAnimating = DTRUE; 
		m_nCurMetacmd = MC_FADEOUT;

		DDWORD dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
		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/16;
		if(fAlpha <= 0.0f)
			fAlpha = 0.0f;

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

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

void Gideon::AI_STATE_Teleport()
{
	switch(Metacmd)
	{
		case 1:		MC_FadeOut();		break;
		case 2:
		{
					m_pAnim_Sound->PlaySound(m_hObject, "teleport.wav", 1000.0f, 100);					
					Metacmd++;			break;
		}
		case 3:
		{
					IntersectQuery IQuery;
					IntersectInfo IInfo;
					DDWORD dwFlags;

					IQuery.m_Flags	  = INTERSECT_OBJECTS;
					IQuery.m_FilterFn = DNULL;

					DVector vDir;
					VEC_SET(vDir, m_pServerDE->Random(-1.0f,1.0f), 0.0f, m_pServerDE->Random(-1.0f,1.0f));

					VEC_COPY(IQuery.m_From, m_MoveObj.GetPos());
					VEC_ADDSCALED(IQuery.m_To, IQuery.m_From, vDir, 1500.0f);

					dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
					dwFlags = dwFlags | FLAG_SOLID;
					m_pServerDE->SetObjectFlags(m_hObject,dwFlags);

					if(m_pServerDE->IntersectSegment(&IQuery, &IInfo))
					{
						VEC_ADDSCALED(IInfo.m_Point, IInfo.m_Point, vDir, -100.0f);
						m_pServerDE->MoveObject(m_hObject, &IInfo.m_Point);
					}
					else
					{
						VEC_ADDSCALED(IInfo.m_Point, IQuery.m_To, vDir, -100.0f);
						m_pServerDE->MoveObject(m_hObject, &IQuery.m_To);
					}

					Metacmd++;
					break;
		}
		case 4:		
		{	
					DVector vColor;
					DFLOAT	fAlpha = 1.0f;

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

					Metacmd++;
					break;
		}
		case 5:		MC_FaceTarget();	break;
		case 6:		ComputeState();		break;
	}

	return;
}

void Gideon::AI_STATE_Special1()
{
	if (!m_hTarget)
	{
		SetNewState(STATE_Teleport);
	}

	switch(Metacmd)
	{
		case 1:		MC_FadeOut();		break;
		case 2:
		{
//					char szSound[256];
//					strcpy(szSound, SOUND_LAUGH);
//					m_pAnim_Sound->GetSoundPath(szSound,m_pServerDE->IntRandom(1,3));

//					PlayAISound(szSound, 1000.0f, PLAY_WAIT);					

					Metacmd++;			break;
		}
		case 3:	
		{
					IntersectQuery IQuery;
					IntersectInfo IInfo;
					DDWORD dwFlags;

					IQuery.m_Flags	  = INTERSECT_OBJECTS;
					IQuery.m_FilterFn = DNULL;

					DVector vDir, vTarget;
					VEC_SET(vDir, m_pServerDE->Random(-1.0f,1.0f), 0.2f, m_pServerDE->Random(-1.0f,1.0f));

					m_pServerDE->GetObjectPos(m_hTarget,&vTarget);

					dwFlags = m_pServerDE->GetObjectFlags(m_hObject);
					dwFlags = dwFlags | FLAG_SOLID;
					m_pServerDE->SetObjectFlags(m_hObject,dwFlags);

					VEC_COPY(IQuery.m_From, vTarget);
					VEC_ADDSCALED(IQuery.m_To, IQuery.m_From, vDir, m_pServerDE->Random(400.0f,600.0f));
					if(m_pServerDE->IntersectSegment(&IQuery, &IInfo))
					{
						VEC_ADDSCALED(IInfo.m_Point, IInfo.m_Point, vDir, -300.0f);
						m_pServerDE->MoveObject(m_hObject, &IInfo.m_Point);
					}
					else
					{
						VEC_ADDSCALED(IInfo.m_Point, IQuery.m_To, vDir, -300.0f);
						m_pServerDE->MoveObject(m_hObject, &IQuery.m_To);
					}

					Metacmd++;
					break;
		}
		case 4:		
		{	
					DVector vColor;
					DFLOAT	fAlpha = 1.0f;

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

					Metacmd++;
					break;
		}
		case 5:		MC_FaceTarget();	break;
		case 6:		ComputeState();		break;
	}

	return;
}

void Gideon::MC_Extra(const char *lpszText)
{
	if(strncmp(lpszText,"powerup",7) == 0)
	{
		MagicPowerup();
	} 
	else
	{
		sprintf(m_szFireNode,"%s",lpszText);
		Fire();
	}
}

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

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

	if(!m_pServerDE->GetModelNodeTransform(m_hObject,m_szFireNode,&vPos,&rRot))
	{
		m_pServerDE->GetObjectPos(m_hObject,&vPos);
		VEC_COPY(vDir, m_MoveObj.GetForwardVector());
	}
	else
	{
		VEC_SUB(vDir, m_vTargetPos, vPos);
	}

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

	DDWORD m_nFiredWeapon = m_InventoryMgr.FireCurrentWeapon(&vPos, &rRot, bAltFire);

	return DTRUE;
}


void Gideon::Save(HMESSAGEWRITE hWrite, DDWORD dwSaveFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	pServerDE->WriteToMessageFloat(hWrite, m_fShieldDuration);
	pServerDE->WriteToMessageFloat(hWrite, m_fLastShield);
	pServerDE->WriteToMessageFloat(hWrite, m_fFullHealth);
	pServerDE->WriteToMessageFloat(hWrite, m_fLastPanic);
}

void Gideon::Load(HMESSAGEREAD hRead, DDWORD dwLoadFlags)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE) return;

	m_fShieldDuration = pServerDE->ReadFromMessageFloat(hRead);
	m_fLastShield = pServerDE->ReadFromMessageFloat(hRead);
	m_fFullHealth = m_pServerDE->ReadFromMessageFloat(hRead);
	m_fLastPanic = m_pServerDE->ReadFromMessageFloat(hRead);
}


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

void Gideon::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);
}

⌨️ 快捷键说明

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