?? sense.cpp
字號:
// Sense.cpp: implementation of the CSense class.
//
//////////////////////////////////////////////////////////////////////
#include "windows.h"
#include "define.h"
#include "Array.h"
#include "VarType.h"
#include "I_Aicenter.h"
#include "I_role.h"
#include "Sense.h"
#include "AGent.h"
#include "AGentData.h"
#include "NpcWorld.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSense::CSense()
{
}
CSense::~CSense()
{
}
bool CSense::Create(CAgent* pOwner)
{
m_pOwner = pOwner;
return true;
}
//////////////////////////////////////////////////////////////////////
bool CSense::CheckCondition(int idxFactFunction, VarTypeSetRef setParam, ARGUMENT_SET* psetArgument)
{
CHECKF(idxFactFunction >= 0);
switch(idxFactFunction)
{
case FACTFUNC_IS_ALIVE: // "IsAlive": // (id),檢測角色是否活著
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
if(pRole && pRole->IsAlive())
return true;
}
break;
case FACTFUNC_IS_WING: // "IsWing": // (id),檢查角色是否在飛行中
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
if(pRole && pRole->IsWing())
return true;
}
break;
case FACTFUNC_IS_USER: // "IsUser", // (id)
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
if(pRole && Cast<CUser>(pRole))
return true;
}
break;
case FACTFUNC_IS_MONSTER: // "IsMonster", // (id)
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
CNpc* pNpc;
if(pRole && Cast(&pNpc, pRole) && pNpc->IsMonster())
return true;
}
break;
case FACTFUNC_EVIL_VALUE: // "EvilValue": // (id, int),取角色的邪惡值,怪物和藍名、黑名為100,紅名為50,衛兵和普通玩家為0
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
if(pRole)
{
VarTypeSet setFactParam;
setFactParam.Push(idRole);
if(pRole->IsEvil())
setFactParam.Push(100);
else if(pRole->IsRighteous())
setFactParam.Push(0);
else
setFactParam.Push(50);
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
return false;
}
break;
case FACTFUNC_COOL_VALUE: // "CoolValue": // (id, int),100 ~ 0,有右手極品武器為50
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
if(pRole)
{
CUser* pUser = Cast<CUser>(pRole);
if(pUser)
{
VarTypeSet setFactParam;
setFactParam.Push(idRole);
int nCool = 0;
if(CItem::IsWeapon2(pUser->GetWeaponRType()))
{
if(CItem::IsNonsuch(pUser->GetWeaponRType()))
nCool += 70;
else if(CItem::IsCool8(pUser->GetWeaponRType()))
nCool += 35;
}
else
{
if(CItem::IsNonsuch(pUser->GetWeaponRType()))
nCool += 50;
else if(CItem::IsCool8(pUser->GetWeaponRType()))
nCool += 25;
}
if(CItem::IsNonsuch(pUser->GetWeaponLType()))
nCool += 20;
else if(CItem::IsCool8(pUser->GetWeaponLType()))
nCool += 10;
if(CItem::IsNonsuch(pUser->GetArmorType()))
nCool += 20;
else if(CItem::IsCool8(pUser->GetArmorType()))
nCool += 10;
if(CItem::IsNonsuch(pUser->GetHelmetType()))
nCool += 10;
else if(CItem::IsCool8(pUser->GetHelmetType()))
nCool += 5;
setFactParam.Push(nCool);
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
}
return false;
}
break;
case FACTFUNC_LEVEL: // "Level": // (id, int),取角色等級(身上裝備的最高等級)
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
if(pRole)
{
CUser* pUser = Cast<CUser>(pRole);
if(pUser)
{
VarTypeSet setFactParam;
setFactParam.Push(idRole);
int nLevel = 0;
CItemTypeData* pType = NpcWorld()->GetItemType()->QueryItemType(pUser->GetWeaponRType());
int nLev = pType->GetInt(ITEMTYPEDATA_REQ_LEVEL);
if(nLevel < nLev)
nLevel = nLev;
pType = NpcWorld()->GetItemType()->QueryItemType(pUser->GetWeaponLType());
nLev = pType->GetInt(ITEMTYPEDATA_REQ_LEVEL);
if(nLevel < nLev)
nLevel = nLev;
pType = NpcWorld()->GetItemType()->QueryItemType(pUser->GetArmorType());
nLev = pType->GetInt(ITEMTYPEDATA_REQ_LEVEL);
if(nLevel < nLev)
nLevel = nLev;
pType = NpcWorld()->GetItemType()->QueryItemType(pUser->GetHelmetType());
nLev = pType->GetInt(ITEMTYPEDATA_REQ_LEVEL);
if(nLevel < nLev)
nLevel = nLev;
setFactParam.Push(nLevel);
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
}
return false;
}
break;
case FACTFUNC_MY_LIFE: // "MyLife": // (int)
{
int nLife = m_pOwner->GetLife();
VarTypeSet setFactParam;
setFactParam.Push(nLife);
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
break;
case FACTFUNC_ROLE_POS: // "RolePos", // (id,x,y),取角色的坐標
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
if(pRole && pRole->GetMapID() == m_pOwner->GetMapID())
{
VarTypeSet setFactParam;
setFactParam.Push(idRole);
setFactParam.Push(pRole->GetPosX());
setFactParam.Push(pRole->GetPosY());
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
}
break;
case FACTFUNC_MYDISTANCE: // "MyDistance", // (x,y,int),離目標點的距離
{
int nPosX = (int)IAiCenter::GetValue(setParam[0], psetArgument);
int nPosY = (int)IAiCenter::GetValue(setParam[1], psetArgument);
//if(m_pOwner->GetMapID() == SHOP_MAP_ID)
{
VarTypeSet setFactParam;
setFactParam.Push(nPosX);
setFactParam.Push(nPosY);
setFactParam.Push(m_pOwner->GetDistance(nPosX, nPosY));
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
}
break;
case FACTFUNC_ATTACK_DISTNACE: // "AttackDistance", // (id,int),能攻擊對方的距離
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
if(pRole && pRole->GetMapID() == m_pOwner->GetMapID())
{
VarTypeSet setFactParam;
setFactParam.Push(idRole);
setFactParam.Push(m_pOwner->GetAttackRange(pRole->GetSizeAdd()));
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
}
break;
case FACTFUNC_DANGER_VALUE: // "DangerValue": // (int),+∞ ~ 0,通常80算危險,單個敵人為50,無敵人為0
{
int nDanger = 0;
CNpcBigSet::Iterator pNpc = NpcManager()->QuerySet()->NewEnum();
while(pNpc.Next())
{
if(pNpc && pNpc->IsEvil())
{
if(m_pOwner->IsCloseTarget(Cast<IRole,INpc>(pNpc)))
nDanger = ::CutTrail(50, nDanger + 20);
else if(m_pOwner->IsLookTarget(Cast<IRole,INpc>(pNpc)))
nDanger += 5;
}
}
CUserSet::Iterator pUser = UserManager()->QuerySet()->NewEnum();
while(pUser.Next())
{
if(pUser && pUser->IsEvil())
{
if(m_pOwner->IsCloseTarget(Cast<IRole,CUser>(pUser)))
nDanger = ::CutTrail(50, nDanger + 20);
else if(m_pOwner->IsLookTarget(Cast<IRole,CUser>(pUser)))
nDanger += 5;
}
}
VarTypeSet setFactParam;
setFactParam.Push(nDanger);
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
break;
case FACTFUNC_ITEM_COUNT: // "ItemCount" // (int),40 ~ 0,背包中物品數量(藥品數量)
{
CItemPack* pPack = Cast<CItemPack>(m_pOwner);
IF_OK(pPack)
{
VarTypeSet setFactParam;
setFactParam.Push(pPack->QueryItemSet()->GetAmount());
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
}
break;
case FACTFUNC_MY_LEADER: // "MyLeader": // (id),隊長ID
{
CTeam* pTeam = Cast<CTeam>(m_pOwner);
if(pTeam && pTeam->IsValid())
{
VarTypeSet setFactParam;
setFactParam.Push(pTeam->GetLeaderID());
return IAiCenter::MatchParam(setFactParam, setParam, psetArgument);
}
}
break;
case FACTFUNC_IS_LEADER: // "IsLeader": // (id),檢查是否隊長
{
OBJID idRole = (int)IAiCenter::GetValue(setParam[0], psetArgument);
IRole* pRole = UserManager()->QueryRole(idRole);
CUser* pUser;
if(pRole && Cast(&pUser, pRole) && pUser->IsTeamLeader())
{
return true;
}
}
break;
default:
{
ASSERT(!"switch(idxFactFunction)");
}
}
return false;
}
void CSense::Die()
{
}
void CSense::BeAttack(IRole *pRole)
{
// Cast<CRoleFight>(m_pOwner)->BeAttack(pRole);
}
void CSense::BeKill(IRole *pRole)
{
// Cast<CRoleFight>(m_pOwner)->BeKill(pRole);
/* int nPriority = 0;
String strFact = FACT_MODE; // "Mode" // (e,e) // 0
strFact += "(1,1)";
IAiCenter* pAi = Cast<IAiCenter>(m_pOwner);
pAi->AddFact(strFact, nPriority);
*/}
void CSense::Recruit(int nLife)
{
}
void CSense::Reborn()
{
/* int nPriority = 0;
String strFact = FACT_MODE; // "Mode" // (e,e) // 0
if(Cast<CTeam>(m_pOwner)->IsValid())
strFact += "(2,2)";
else
strFact += "(2,1)";
IAiCenter* pAi = Cast<IAiCenter>(m_pOwner);
pAi->AddFact(strFact, nPriority);
*/}
void CSense::TeamApply(OBJID idUser)
{
char szNum[20];
_ltoa(idUser, szNum, 10);
int nPriority = 50;
String strFact = FACT_TEAM_INVITE; // "TeamInvite" // (id) // 50
strFact += '(';
strFact += szNum;
strFact += ')';
IAiCenter* pAi = Cast<IAiCenter>(m_pOwner);
pAi->AddFact(strFact, nPriority);
}
void CSense::OnTimer()
{
int nPriority = 80;
if(m_tLook.ToNextTime(::Priority2Durable(80)))
{
vector<IRole*> setRole;
POINT pos;
pos.x = m_pOwner->GetPosX();
pos.y = m_pOwner->GetPosY();
m_pOwner->GetMap()->CollectRole(&setRole, pos, m_pOwner->GetLookRange());
for(int i = 0; i < setRole.size(); i++)
{
IRole* pRole = setRole[i];
if(pRole && pRole->GetID() != m_pOwner->GetID())
{
char szNum[20];
_ltoa(pRole->GetID(), szNum, 10);
String strFact = FACT_LOOK_TARGET; // "LookTarget" // <id> // 80
strFact += '<';
strFact += szNum;
strFact += '>';
IAiCenter* pAi = Cast<IAiCenter>(m_pOwner);
pAi->AddFact(strFact, nPriority);
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -