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

📄 ai_mgr.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"NONE", 4) == 0)
    {
        m_nRetWeapon = WEAP_NONE;
    }
//    WEAP_NONE,
    else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"PROX_BOMB", 9) == 0)
    {
        m_nRetWeapon = WEAP_PROXIMITYBOMB;
    }
//	WEAP_SHIKARI_CLAW
    else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SHIKARI_CLAW", 12) == 0)
    {
        m_nRetWeapon = WEAP_SHIKARI_CLAW;
    }
//	WEAP_SHIKARI_SPIT
    else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SHIKARI_SPIT", 12) == 0)
    {
        m_nRetWeapon = WEAP_SHIKARI_SPIT;
    }
//	WEAP_SOUL_CROWBAR
    else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SOUL_CROWBAR", 12) == 0)
    {
        m_nRetWeapon = WEAP_SOUL_CROWBAR;
    }
//	WEAP_SOUL_AXE
    else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SOUL_AXE", 8) == 0)
    {
        m_nRetWeapon = WEAP_SOUL_AXE;
    }
//	WEAP_SOUL_PIPE
    else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SOUL_PIPE", 9) == 0)
    {
        m_nRetWeapon = WEAP_SOUL_PIPE;
    }
//	WEAP_SOUL_HOOK
    else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SOUL_HOOK", 9) == 0)
    {
        m_nRetWeapon = WEAP_SOUL_HOOK;
    }
//	WEAP_BEHEMOTH_CLAW
    else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"BEHEMOTH_CLAW", 13) == 0)
    {
        m_nRetWeapon = WEAP_BEHEMOTH_CLAW;
    }
//  WEAP_ZEALOT_HEAL
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"HEAL", 4) == 0)
	{
		m_nRetWeapon = WEAP_ZEALOT_HEAL;
	}
//  WEAP_ZEALOT_SHIELD
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SHIELD", 6) == 0)
	{
		m_nRetWeapon = WEAP_ZEALOT_SHIELD;
	}
//  WEAP_ZEALOT_ENERGYBLAST
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"ENERGY_BLAST", 12) == 0)
	{
		m_nRetWeapon = WEAP_ZEALOT_ENERGYBLAST;
	}
//  WEAP_ZEALOT_GROUNDFIRE
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"GROUND_FIRE", 11) == 0)
	{
		m_nRetWeapon = WEAP_ZEALOT_GROUNDFIRE;
	}
//  WEAP_ZEALOT_SHOCKWAVE
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SHOCKWAVE", 9) == 0)
	{
		m_nRetWeapon = WEAP_ZEALOT_SHOCKWAVE;
	}
//  WEAP_DRUDGE_FIREBALL
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"FIREBALL", 8 ) == 0)
	{
		m_nRetWeapon = WEAP_DRUDGE_FIREBALL;
	}
//	WEAP_DRUDGE_LIGHTNING
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"LIGHTNING", 9 ) == 0)
	{
		m_nRetWeapon = WEAP_DRUDGE_LIGHTNING;
	}
//  WEAP_HAND_SQUEEZE
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"HAND_SQUEEZE", 12 ) == 0)
	{
		m_nRetWeapon = WEAP_HAND_SQUEEZE;
	}
//  WEAP_THIEF_SUCK
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"THIEF_SUCK", 10 ) == 0)
	{
		m_nRetWeapon = WEAP_THIEF_SUCK;
	}
//  WEAP_BONELEECH_SUCK
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"BONELEECH_SUCK", 14 ) == 0)
	{
		m_nRetWeapon = WEAP_BONELEECH_SUCK;
	}
//  WEAP_NIGHTMARE_BITE
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"NIGHTMARE_BITE", 14 ) == 0)
	{
		m_nRetWeapon = WEAP_NIGHTMARE_BITE;
	}
//  WEAP_BEHEMOTH_SHOCKWAVE
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"BEHEMOTH_SHOCKWAVE", 18 ) == 0)
	{
		m_nRetWeapon = WEAP_BEHEMOTH_SHOCKWAVE;
	}
//	WEAP_DEATHSHROUD_ZAP
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"DEATHSHROUD_ZAP", 15 ) == 0)
	{
		m_nRetWeapon = WEAP_DEATHSHROUD_ZAP;
	}
//	WEAP_NAGA_EYEBLAST
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"NAGA_BLAST", 10 ) == 0)
	{
		m_nRetWeapon = WEAP_NAGA_EYEBEAM;
	}
//	WEAP_NAGA_SPIKE
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"NAGA_SPIKE", 10 ) == 0)
	{
		m_nRetWeapon = WEAP_NAGA_SPIKE;
	}
//	WEAP_NAGA_DEBRIS
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"NAGA_DEBRIS", 11 ) == 0)
	{
		m_nRetWeapon = WEAP_NAGA_DEBRIS;
	}
//	WEAP_GIDEON_SHIELD
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"GIDEON_SHIELD", 13 ) == 0)
	{
		m_nRetWeapon = WEAP_GIDEON_SHIELD;
	}
//	WEAP_GIDEON_WIND
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"GIDEON_WIND", 11 ) == 0)
	{
		m_nRetWeapon = WEAP_GIDEON_WIND;
	}
//	WEAP_GIDEON_GOO
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"GIDEON_GOO", 10 ) == 0)
	{
		m_nRetWeapon = WEAP_GIDEON_GOO;
	}
//	WEAP_GIDEON_VOMIT
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"GIDEON_VOMIT", 12 ) == 0)
	{
		m_nRetWeapon = WEAP_GIDEON_VOMIT;
	}
//	WEAP_GIDEON_SPEAR
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"GIDEON_SPEAR", 12 ) == 0)
	{
		m_nRetWeapon = WEAP_GIDEON_SPEAR;
	}
//	WEAP_ANCIENTONE_BEAM
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"ANCIENTONE_BEAM", 15 ) == 0)
	{
		m_nRetWeapon = WEAP_ANCIENTONE_BEAM;
	}
//	WEAP_ANCIENTONE_TENTACLE
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"ANCIENTONE_TENTACLE", 19 ) == 0)
	{
		m_nRetWeapon = WEAP_ANCIENTONE_TENTACLE;
	}
//	WEAP_SKULL
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"SKULL", 5 ) == 0)
	{
		m_nRetWeapon = WEAP_SKULL;
	}
#ifdef _ADD_ON
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"ROCK", 4 ) == 0)
	{
		m_nRetWeapon = WEAP_GREMLIN_ROCK;
	}
	else if ( _mbsncmp((const unsigned char*)pWeapon, (const unsigned char*)"NIGHTMARE_FIREBALL", 18) == 0)
	{
		m_nRetWeapon = WEAP_NIGHTMARE_FIREBALLS;
	}
#endif


    return m_nRetWeapon;
}

// ----------------------------------------------------------------------- //
// ROUTINE		: AI_Mgr::EngineMessageFn
// DESCRIPTION	: Handle engine messages
// RETURN TYPE	: DDWORD 
// PARAMS		: DDWORD messageID
// PARAMS		: void *pData
// PARAMS		: DFLOAT fData
// ----------------------------------------------------------------------- //

DDWORD AI_Mgr::EngineMessageFn(DDWORD messageID, void *pData, DFLOAT fData)
{
	switch(messageID)
	{
		case MID_UPDATE:
		{
			if (!AI_Update()) 
            {
				RemoveMe();
            }
			break;
		}

		case MID_INITIALUPDATE:
		{
			if (fData != INITIALUPDATE_WORLDFILE)
				m_bMoveToGround = DFALSE;

			InitialUpdate((int)fData);
			break;
		}

		case MID_PRECREATE:
		{
			if (fData == PRECREATE_WORLDFILE || fData == PRECREATE_STRINGPROP)
				ReadProp((ObjectCreateStruct*)pData);
			break;
		}

		case MID_TOUCHNOTIFY:
        {
			HandleTouch((HOBJECT)pData);
			break;
        }

		case MID_MODELSTRINGKEY:
		{
			OnStringKey((ArgList*)pData);
			return 0;
		}

		// If we created a link to the target, this will tell us that it no longer exists
		case MID_LINKBROKEN:
		{
			HOBJECT hObj = (HOBJECT)pData;
			if (hObj == m_hTarget)
			{
				m_hTarget = DNULL;
			}
			if (hObj == m_hTrackObject)
			{
				m_hTrackObject = DNULL;
			}
			if(m_hCurSmell)
			{
				if (hObj == m_hCurSmell)
				{
					m_hTrackObject = DNULL;
					SetNewState(STATE_Idle);
				}
			}

			break;
		}

		case MID_SAVEOBJECT:
			Save((HMESSAGEWRITE)pData, (DDWORD)fData);
			break;

		case MID_LOADOBJECT:
			Load((HMESSAGEREAD)pData, (DDWORD)fData);
			InsertMe();
			break;
		
		default : break;
	}

	return CBaseCharacter::EngineMessageFn(messageID, pData, fData);
}


// ----------------------------------------------------------------------- //
// ROUTINE		: AI_Mgr::ObjectMessageFn
// DESCRIPTION	: Handle inter-object messages
// RETURN TYPE	: DDWORD 
// PARAMS		: HOBJECT hSender
// PARAMS		: DDWORD messageID
// PARAMS		: HMESSAGEREAD hRead
// ----------------------------------------------------------------------- //

DDWORD AI_Mgr::ObjectMessageFn(HOBJECT hSender, DDWORD messageID, HMESSAGEREAD hRead)
{
	switch(messageID)
	{
		case MID_DAMAGE:
		{
			if (!m_pServerDE) break;
			
			CBaseCharacter::ObjectMessageFn(hSender, messageID, hRead);
			HandleDamage();

			return 0;
		}

 		case MID_TRIGGER:
		{
			HandleTrigger(hSender, hRead);
			break;
		}
    
		case MID_ADDAMMO:
		{
			if (!m_damage.IsDead())
			{
				if (!(m_dwFlags & FLAG_NOAMMOCOLLECT)) {
					DBYTE nAmmoType = m_pServerDE->ReadFromMessageByte(hRead);
					DFLOAT fAmmoCount = m_pServerDE->ReadFromMessageFloat(hRead);
					// Try to add ammo
					int iRet = m_InventoryMgr.AddAmmo(nAmmoType, fAmmoCount);

					if (iRet == CHWEAP_OK)
						m_InventoryMgr.SendPickedUpMessage(hSender, iRet);
				}
			}
		}
		break;

		default : break;
	}

	return CBaseCharacter::ObjectMessageFn(hSender, messageID, hRead);
}


// ----------------------------------------------------------------------- //
// ROUTINE		: AI_Mgr::ReadProp
// DESCRIPTION	: read properties from ED file
// RETURN TYPE	: DBOOL 
// PARAMS		: BaseClass *pObject
// PARAMS		: ObjectCreateStruct *pStruct
// ----------------------------------------------------------------------- //

DBOOL AI_Mgr::ReadProp(ObjectCreateStruct *pStruct)
{
	CServerDE* pServerDE = BaseClass::GetServerDE();
	if (!pServerDE || !pStruct) return DFALSE;	

	char buf[MAX_CS_FILENAME_LEN];

	pServerDE->GetPropReal("RandomHitPoints", &m_fAIRandomHP);
    
	buf[0] = '\0';
	pServerDE->GetPropString("AIState", buf, MAX_CS_FILENAME_LEN);
	if (buf[0]) _mbsncpy((unsigned char*)m_szAIState, (const unsigned char*)buf, 32);

	//SCHLEGZ 5/25/98 2:22:03 AM: new DEdit fields for the level designers
	for(int i = 1; i <= MAX_NUM_WEAPONS; i++)
	{
		char szTemp[32];

		sprintf(szTemp,"AIWeapon%d",i);

		buf[0] = '\0';
		pServerDE->GetPropString(szTemp, buf, MAX_CS_FILENAME_LEN);
		if (buf[0]) 
			_mbsncpy((unsigned char*)m_szAIWeapon[i - 1], (const unsigned char*)buf, 32);
	}

	pServerDE->GetPropReal("Bullets", &m_fAIBullets);
	pServerDE->GetPropReal("BMG", &m_fAIBMG);
	pServerDE->GetPropReal("Shells", &m_fAIShells);
	pServerDE->GetPropReal("Grenades", &m_fAIGrenades);
	pServerDE->GetPropReal("Rockets", &m_fAIRockets);
	pServerDE->GetPropReal("Flares", &m_fAIFlares);
	pServerDE->GetPropReal("Cells", &m_fAICells);
	pServerDE->GetPropReal("Charges", &m_fAICharges);
	pServerDE->GetPropReal("Fuel", &m_fAIFuel);
	pServerDE->GetPropReal("Proximity_Bombs", &m_fProxBombs);

	buf[0] = '\0';
	pServerDE->GetPropString("SpotTriggerTarget", buf, MAX_CS_FILENAME_LEN);
	if (buf[0]) m_hstrSpotTriggerTarget = pServerDE->CreateString(buf);

	buf[0] = '\0';
	pServerDE->GetPropString("SpotTriggerMessage", buf, MAX_CS_FILENAME_LEN);
	if (buf[0]) m_hstrSpotTriggerMessage = pServerDE->CreateString(buf);

	buf[0] = '\0';
	pServerDE->GetPropString("TriggerRelayTarget", buf, MAX_CS_FILENAME_LEN);
	if (buf[0]) m_hstrTriggerRelayTarget = pServerDE->CreateString(buf);

	return DTRUE;
}


// ----------------------------------------------------------------------- //
// ROUTINE		: AI_Mgr::OnStringKey
// DESCRIPTION	: read and parse string keys
// RETURN TYPE	: void 
// PARAMS		: ArgList* pArgList
// ----------------------------------------------------------------------- //

void AI_Mgr::OnStringKey(ArgList* pArgList)
{
	if (!m_pServerDE || !pArgList || !pArgList->argv || pArgList->argc == 0) return;

	char* pKey = pArgList->argv[0];
	if (!pKey) return;

	char szTemp[32];

	//fire current weapon 
	if(Sparam_Get(szTemp,pKey,"fire_key"))
	{
		if(m_hTarget == DNULL)
			return;

		Fire();
	}
	else if(Sparam_Get(szTemp,pKey,"show_weapon"))
	{
		char szTmp[8];
		int nNum = atoi(szTmp);

		CWeapon* pW = m_InventoryMgr.GetCurrentWeapon();

		if(pW)
			pW->ShowHandModel(nNum);
	}
	else if(Sparam_Get(szTemp,pKey,"extra_key"))
	{
		MC_Extra(szTemp);
	}
	else if(Sparam_Get(szTemp,pKey,"play_sound"))
	{
		//scripted scene? disable!!
		if(g_hActiveCamera && m_nState != STATE_Script ) // && m_nState != STATE_Passive && m_nState != STATE_Idle)
		{
			CameraObj* pCameraObj = (CameraObj*)m_pServerDE->HandleToObject(g_hActiveCamera);
			if(!pCameraObj->AllowPlayerMovement())
			{
				return;
			}
		}

		if(m_nState != STATE_Script)
		{
			char szSound[256];
			char szTmp[8];

			if(Sparam_Get(szTmp,pKey,"sound_random"))
			{
				int nMax = atoi(szTmp);
				int nNum = m_pServerDE->IntRandom(1,NRES(nMax));
				sprintf(szSound, "%s%d.wav", szTemp, nNum);
			}
			else
			{
				sprintf(szSound, "%s.wav", szTemp);
			}

			DFLOAT fRadius = 1000.0f;

			if(Sparam_Get(szTmp,pKey,"sound_radius"))
			{
				fRadius = (DFLOAT)atof(szTmp);
			}

			int nVol = 100;

			if(Sparam_Get(szTmp,pKey,"sound_volume"))
			{
				nVol = atoi(szTmp);
			}

			int nChance = 100;

			if(Sparam_Get(szTmp,pKey,"sound_chance"))
			{
				nChance = atoi(szTmp);
			}

			DBOOL bVoice = DFALSE;

			if(Sparam_Get(szTmp,pKey,"sound_voice"))
			{
				bVoice = atoi(szTmp);
			}

			if(IsRandomChance(nChance))
			{
				if(bVoice)
					m_pAnim_Sound->PlayVoice(m_hObject, szSound, fRadius, nVol);
				else
					m_pAnim_Sound->PlaySound(m_hObject, szSound, fRadius, nVol);
			}
		}

⌨️ 快捷键说明

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