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

📄 aisystem.cpp

📁 墨香最新私服
💻 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 + -