📄 ai_mgr.cpp
字号:
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 + -