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

📄 ishmaelai.cpp

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

			char* szSound = "sounds\\enemies\\zealot\\magic.wav";
			PlaySoundFromObject(m_hObject, szSound, 2000.0f, SOUNDPRIORITY_MISC_MEDIUM, 
								DFALSE, DTRUE, DTRUE);

			DDWORD nType = EXP_DIVINE_SHOCKBALL;

			DVector vPos, vNormal;

			VEC_COPY(vPos, m_MoveObj.GetPos());
			VEC_COPY(vNormal, m_MoveObj.GetUpVector());

			//********************************************************************
			// Create the explosion type
			HMESSAGEWRITE hMessage = m_pServerDE->StartInstantSpecialEffectMessage(&vPos);
			m_pServerDE->WriteToMessageByte(hMessage, SFX_EXPLOSIONFX_ID);

			m_pServerDE->WriteToMessageVector(hMessage, &vPos);
			m_pServerDE->WriteToMessageVector(hMessage, &vNormal);
			m_pServerDE->WriteToMessageDWord(hMessage, nType);

			m_pServerDE->EndMessage(hMessage);

			//********************************************************************
			// Move all the objects within the radius back and randomly rotate them a little
			ObjectList *ol = m_pServerDE->FindObjectsTouchingSphere(&vPos, LIFELEECH_PUSH_RADIUS);

			if(ol)
			{
				DVector		vObjPos, vObjVel, vUp;
				DRotation	rObjRot;
				ObjectLink* pLink = ol->m_pFirstLink;
				DFLOAT		mag, randRot = MATH_PI * LIFELEECH_ROTATE_AMOUNT;
				HOBJECT		hObj;
				short		objType;

				VEC_SET(vUp, 0.0f, 1.0f, 0.0f);

				while(pLink)
				{
					hObj = pLink->m_hObject;
					pLink = pLink->m_pNext;

					objType = m_pServerDE->GetObjectType(hObj);

					if(hObj == m_hObject) continue;
					if((objType != OT_MODEL) && (objType != OT_WORLDMODEL)) continue;

					// Get the information about the obj
					m_pServerDE->GetObjectPos(hObj, &vObjPos);
					m_pServerDE->GetObjectRotation(hObj, &rObjRot);
					m_pServerDE->GetVelocity(hObj, &vObjVel);

//					m_pServerDE->RotateAroundAxis(&rObjRot, &vUp, m_pServerDE->Random(-randRot, randRot));
//					m_pServerDE->SetObjectRotation(hObj, &rObjRot);

					VEC_SUB(vObjPos, vObjPos, vPos);
					mag = LIFELEECH_PUSH_RADIUS - VEC_MAG(vObjPos);
					if(mag < 0.0f)	mag = 0.0f;
					VEC_NORM(vObjPos);
					VEC_MULSCALAR(vObjPos, vObjPos, mag * 5.0f);
					m_pServerDE->GetGlobalForce(&vUp);
					VEC_MULSCALAR(vUp, vUp, -0.15f);
					VEC_ADD(vObjVel, vObjVel, vUp);
					VEC_ADD(vObjVel, vObjVel, vObjPos);
//					m_pServerDE->SetVelocity(hObj, &vObjVel);

					m_pServerDE->GetObjectPos(hObj, &vObjPos);
					DFLOAT fDamage = (DFLOAT)m_pServerDE->IntRandom(25,50);
					DamageObject(m_hObject, this, hObj, fDamage, vObjVel, vObjPos, DAMAGE_TYPE_EXPLODE);
				}

				m_pServerDE->RelinquishList(ol);
			}

			RemoveMe();
		}
	}

	return;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: IshmaelAI::ComputeState
// DESCRIPTION	: Compute actual substate
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void IshmaelAI::ComputeState(int nStimType)
{
	int nStim = nStimType;

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

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

	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;
			case STATE_Escape_RunAway:		SetNewState(STATE_Idle);			break;
			case STATE_Escape_Hide:			SetNewState(STATE_Idle);			break;
			default:						SetNewState(STATE_SearchVisualTarget);	break;
		}
	}
	else
	{
		if((m_fStimuli[HEALTH] < 0.1f) && (m_nState != STATE_Escape_Hide))
		{
			SetNewState(STATE_Escape_Hide);
			return;
		}

		if(m_fStimuli[SENSE] < 0.65f || fHeight > m_vDims.y)
			SetNewState(STATE_AttackFar);
		else
			SetNewState(STATE_AttackClose);
	}

	return;
}

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

void IshmaelAI::AI_STATE_AttackClose()
{
	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)
	{
		SetNewState(STATE_SearchVisualTarget);
		return;
	}

	m_fStimuli[SENSE] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);

	switch(Metacmd)
	{
		case 1:		MC_FaceTarget();	break;	
		case 2:		if(m_fStimuli[SENSE] <= (m_fSensingDist * 0.20) && m_nCurMetacmd != MC_FIRE_STAND)
					{
						SetNewState(STATE_Teleport);
					}
					else
						Metacmd++;

					break;
		case 3:		MC_FaceTarget();
					Metacmd--;

					if((m_fStimuli[SENSE] >= (m_fSensingDist * 0.35) && m_nCurMetacmd != MC_FIRE_STAND)
						|| fHeight > m_vDims.y)
					{
						ComputeState();
					}
					else
					{
						MC_Fire_Stand();
					}

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

	return;
}

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

void IshmaelAI::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)
	{
		SetNewState(STATE_SearchVisualTarget);
		return;
	}

	m_fStimuli[SENSE] = VEC_DIST(m_MoveObj.GetPos(),m_vTargetPos);

	switch(Metacmd)
	{
		case 1:		MC_FaceTarget();	break;	
		case 2:		if(m_fStimuli[SENSE] > (m_fSensingDist * 0.75) && fHeight <= m_vDims.y)
					{
						MC_Run();
					}
					else
						Metacmd++;

					break;
		case 3:		MC_FaceTarget();
					Metacmd--;

					if(m_fStimuli[SENSE] <= (m_fSensingDist * 0.75) || m_nCurMetacmd == MC_FIRE_STAND)
					{
						MC_Fire_Stand();
					}
					else
						Metacmd++;

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

	return;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: IshmaelAI::AI_STATE_Escape_Hide
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void IshmaelAI::AI_STATE_Escape_Hide()
{
	switch(Metacmd)
	{
		case 1:		MC_Heal();			break;	
		case 2:		ComputeState();		break;
	}

	return;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: IshmaelAI::AI_STATE_Teleport
// DESCRIPTION	: 
// RETURN TYPE	: void 
// ----------------------------------------------------------------------- //

void IshmaelAI::AI_STATE_Teleport()
{
	switch(Metacmd)
	{
		case 1:		MC_FadeOut();		break;
		case 2:
		{
					char szSound[256];
					sprintf(szSound, "%s%d.wav", SOUND_LAUGH, m_pServerDE->IntRandom(1,3));
					m_pAnim_Sound->PlaySound(m_hObject, szSound, 1000.0f, 100);					

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

					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, m_fSensingDist);

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

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

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

	return;
}

⌨️ 快捷键说明

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