📄 aisystem.cpp
字号:
// AISystem.cpp: implementation of the CAISystem class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AISystem.h"
#include "UserTable.h"
#include "Monster.h"
#include "MsgRouter.h"
#include "MHFile.h"
#include "Player.h"
#include "..\[CC]Header\GameResourceManager.h"
#include "RegenPrototype.h"
#include "ChannelSystem.h"
#include "RegenManager.h"
#include "RegenConditionInfo.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAISystem * g_pAISystem = NULL;
CAISystem::CAISystem()
{
m_pROUTER = new CMsgRouter;
m_pROUTER->InitMsgRouter();
m_AISubordinatedObject.Initialize(1000);
m_MonsterIDGenerator.Init(10000, NEWOBJECT_STARTINDEX);
}
CAISystem::~CAISystem()
{
if(m_pROUTER)
{
m_pROUTER->ReleaseMsgRouter();
delete m_pROUTER;
m_pROUTER = NULL;
}
m_MonsterIDGenerator.Release();
// inner 皋葛府绰 UserTable府胶飘俊辑 昏力窃
RemoveAllList();
}
void CAISystem::RemoveAllList()
{
m_AISubordinatedObject.RemoveAll();
}
void CAISystem::Process()
{
CObject * pObj= NULL;
m_AISubordinatedObject.SetPositionHead();
while((pObj = m_AISubordinatedObject.GetData()))
{
ConstantProcess(pObj);
PeriodicProcess(pObj);
}
m_pROUTER->MsgLoop();
GROUPMGR->RegenProcess();
}
void CAISystem::ConstantProcess(CObject * obj)
{
//CMonster * pMob = (CMonster *)obj;
//pMob->GetStateMachine()->Process(eSEVENT_Process, NULL);
GSTATEMACHINE.Process( obj, eSEVENT_Process, NULL);
}
void CAISystem::PeriodicProcess(CObject * obj)
{
}
void CAISystem::AddObject(CObject * obj)
{
CMonster * pMob = (CMonster * )obj;
m_AISubordinatedObject.Add(obj, pMob->GetID());
// CAIGroup * pGroup = GROUPMGR->GetGroup(pMob->GetMonsterGroupNum(), pMob->GetGridID());
// if(pGroup)
// {
// pGroup->Alive(pMob->GetID());
// }
// else
// {
// //家券 阁胶磐绰 弊缝捞 绝促!
// return;
// }
}
CObject * CAISystem::RemoveObject(DWORD dwID)
{
CObject *outObj = m_AISubordinatedObject.GetData(dwID);
m_AISubordinatedObject.Remove(dwID);
CAIGroup * pGroup = GROUPMGR->GetGroup(((CMonster*)outObj)->GetMonsterGroupNum(), ((CMonster*)outObj)->GetGridID());
if(pGroup)
{
pGroup->Die(outObj->GetID());
pGroup->RegenCheck();
}
else
{
//家券 阁胶磐绰 弊缝捞 绝促!
}
return outObj;
}
void CAISystem::SetTransition(CObject * obj, DWORD inputEvent)
{
//obj->GetStateMachine()->SetState()
}
void CAISystem::SendMsg(WORD msgID, DWORD src, DWORD dest, DWORD delay, DWORD flag)
{
m_pROUTER->SendMsg(msgID, src, dest, delay, flag);
}
DWORD CAISystem::GeneraterMonsterID()
{
DWORD id = m_MonsterIDGenerator.GenerateIndex();
ASSERT(id != 0);
return id;
}
void CAISystem::ReleaseMonsterID(DWORD id)
{
BOOL rt = m_MonsterIDGenerator.ReleaseIndex(id);
// ASSERT(rt);
}
//--------------------------------------------------------------------------------------
// *** Caution ***
// RegenObject 八祸 规过
// Group阑 茫篮 促澜 => ObjectID
// GroupObject 八祸 规过
// => GroupID, battleID
//--------------------------------------------------------------------------------------
void CAISystem::LoadAIGroupList()
{
CMHFile file;
char filename[256];
#ifdef _FILE_BIN_
sprintf(filename,"Resource/Monster_%02d.bin",GAMERESRCMNGR->GetLoadMapNum());
if(!file.Init(filename,"rb"))
return ;
#else
sprintf(filename,"Resource/Monster_%02d.txt",GAMERESRCMNGR->GetLoadMapNum());
if(!file.Init(filename,"rt"))
return ;
#endif
int ChannelCount = CHANNELSYSTEM->GetChannelCount();
DWORD BattleID = 0;
CAIGroup * pNewGroup[MAX_CHANNEL_NUM];
CRegenObject * pNewRegenObject[MAX_CHANNEL_NUM];
CRegenPrototype * pRegenPrototype = NULL;
char buff[256];
while(1)
{
if(file.IsEOF())
{
break;
}
file.GetString(buff);
if(buff[0] == '}')
{
continue;
}
if(buff[0] == '{')
{
continue;
}
if(buff[0] == '@')
{
file.GetLineX(buff, 256);
continue;
}
strcpy(buff, _strupr(buff));
CMD_ST(buff)
CMD_CS("$GROUP")
DWORD GROUPID = file.GetDword();
for(int i = 0 ; i < ChannelCount ; ++i)
{
pNewGroup[i] = new CAIGroup;
pNewGroup[i]->m_dwGroupID = GROUPID;
pNewGroup[i]->m_dwGridID = CHANNELSYSTEM->GetChannelID(i);
GROUPMGR->AddGroup(pNewGroup[i]);
}
CMD_CS("#MAXOBJECT")
file.GetDword();
CMD_CS("#PROPERTY")
file.GetWord();
CMD_CS("#GROUPNAME")
file.GetString();
CMD_CS("#ADDCONDITION")
DWORD TARGETGROUPID = file.GetDword();
float RATIO = file.GetFloat();
DWORD REGENDELAY = file.GetDword();
for(int i = 0 ; i < ChannelCount ; ++i)
{
CRegenConditionInfo * pCondInfo = new CRegenConditionInfo;
pCondInfo->dwStartRegenTick = 0;
pCondInfo->dwTargetGroupID = TARGETGROUPID;
pCondInfo->fRemainderRatio = RATIO;
pCondInfo->dwRegenDelay = REGENDELAY;
pCondInfo->bRegen = TRUE;
ASSERT(GROUPMGR->GetGroup(TARGETGROUPID,CHANNELSYSTEM->GetChannelID(i)));
pNewGroup[i]->AddConditionInfo(pCondInfo);
}
CMD_CS("#ADD")
pRegenPrototype = new CRegenPrototype;
BYTE OBJECTKIND = pRegenPrototype->ObjectKind = file.GetByte();
file.GetDword();
DWORD OBJECTID = pRegenPrototype->dwObjectID = GeneraterMonsterID();//pRegenPrototype->dwObjectID = file.GetDword();
WORD MONSTERKIND = pRegenPrototype->wMonsterKind = file.GetWord();
float POSX = pRegenPrototype->vPos.x = file.GetFloat();
float POSZ = pRegenPrototype->vPos.z = file.GetFloat();
BOOL ISREGEN = file.GetBool();
BASE_MONSTER_LIST* pMonsterInfo = GAMERESRCMNGR->GetMonsterListInfo(MONSTERKIND);
WORD HELPTYPE = pRegenPrototype->InitHelpType = pMonsterInfo->InitHelpType;
BOOL ISHEARING = pRegenPrototype->bHearing = pMonsterInfo->bHearing;
DWORD HEARINGDISTANCE = pRegenPrototype->HearingDistance = pMonsterInfo->HearingDistance;
REGENMGR->AddPrototype(pRegenPrototype);
for(int i = 0 ; i < ChannelCount ; ++i)
{
pNewRegenObject[i] = new CRegenObject;
pNewRegenObject[i]->InitPrototype(pRegenPrototype);
pNewRegenObject[i]->m_dwObjectID = GeneraterMonsterID();
pNewRegenObject[i]->m_dwSubObjectID = OBJECTID;
pNewRegenObject[i]->m_dwGridID = CHANNELSYSTEM->GetChannelID(i);
pNewRegenObject[i]->m_dwGroupID = pNewGroup[i]->m_dwGroupID;
pNewRegenObject[i]->InitHelpType();
pNewGroup[i]->AddRegenObject(pNewRegenObject[i]);
if(ISREGEN)
{
pNewGroup[i]->Die(pNewRegenObject[i]->m_dwObjectID);
}
}
pRegenPrototype = NULL;
CMD_EN
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -