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

📄 gdialog.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
字号:
//GDialog.cc
/*/////////////////////////////////////////////////////////////////
对话管理


   李亦
	liease@163.com 4040719
	2006-7-30
/*/////////////////////////////////////////////////////////////////

#include "rpg/RPGDataman.h"
#include "console/console.h"
#include "rpg/core/tObjDictionary.h"
#include "rpg/gobjects/GDialog.h"
#include "rpg/gobjects/GTaskState.h"
#include "rpg/RPGTextParse.h"
#include "rpg/RPGPlayerAux.h"


namespace RPG
{

GDialog*	g_pGDialog = NULL;

IMPLEMENT_CONOBJECT(GDialog);



GDlgAnswer::GDlgAnswer()
{
	m_pCmd = NULL;
}

GDlgPiece::GDlgPiece()
{
	m_pCmd = NULL;
	dMemset(m_arAnswers,0,sizeof(GDlgAnswer*) * GDLG_ANSWER_NUM);
	dMemset(m_arNexts,0,sizeof(GDlgPiece*) * GDLG_ANSWER_NUM);
	dMemset(m_arNext2s,0,sizeof(GDlgPiece*) * GDLG_ANSWER_NUM);
}


void GDlgPiece::ToggleDlgPiece()
{
	U32 n;
	GDlgAnswer* pAnswer;
	DSTR			sAnswer;


	AssertWarn(g_pRPGTextParse,"需要先创建RPGTextParse实例");
	//if(m_pCmd)
	//	Con::setVariable("$RPG::Dialog::Content",
	//				avar("%s\n%s",m_data.sContent, m_pCmd->GetEfficacyText(g_pGPlayer)));
	//else

	//$RPG::AnswerSlyle/acmd:%nIndex%sAnswer/unacomd
	Con::setVariable("$RPG::Dialog::Content",m_data.sContent);

	for(n=0; n<GDLG_ANSWER_NUM; n++)
	{
		pAnswer = m_arAnswers[n];
		if(pAnswer)
			sAnswer = pAnswer->m_data.sContent;
		else
			sAnswer = "";

		if(sAnswer[0] == 0)
		{
			Con::setVariable(avar("$RPG::Dialog::Answer%d",n),sAnswer);
			continue;
		}

		g_pRPGTextParse->BeginParse();
		if(pAnswer->IsAbort())
			(*g_pRPGTextParse) << "/<dlgabort>";
		else if(pAnswer->IsEnd())
			(*g_pRPGTextParse) << "/<dlgend>";
		else
		{	
			char szLetter[] = "/<chara>";
			szLetter[6] = 'a' + n;
			(*g_pRPGTextParse) << szLetter;
		}
		(*g_pRPGTextParse) << sAnswer;

		Con::setVariable(avar("$RPG::Dialog::Answer%d",n), g_pRPGTextParse->GetParseText());
	}//for(n=0; n<GDLG_ANSWER_NUM; n++)
}

DSTR	GDlgPiece::GetAnswerText(U32 nIndex)
{
	GDlgAnswer* pAnswer;

	if(nIndex >= GDLG_ANSWER_NUM)
		return "";

	pAnswer = m_arAnswers[nIndex];
	if(pAnswer)
		return m_data.sContent;

	return "";
}

//IMPLEMENT_GDIALOG(GDialog, DlgAnswer);
//IMPLEMENT_GDIALOG(GDialog, DlgPiece);

/////////////////////////////////////////////////////////////////
// class GDialog 构造函数 /析构函数
GDialog::GDialog()
//:INIT_GDIALOG(GDialog, DlgAnswer, HASKSIZE)
//,INIT_GDIALOG(GDialog, DlgPiece, HASKSIZE)
{
	m_dwRPGTypes |= GOT_DIALOG;
	//m_pGoodsDefine = NULL;
}
GDialog::~GDialog()
{
}



DSTR GDialog::GetAnswerText(U32 dwPieceID, U32 nIndex)
{
	GDlgPiece*	pPiece;


	if(dwPieceID == -1)
		pPiece = m_pDlgPiece;
	else
		pPiece = g_pRPGDataMan->GetDlgPiece(dwPieceID);

	if(pPiece == NULL)
		return "";
	return pPiece->GetAnswerText(nIndex);
}




void GDialog::ToggleDlgPiece(U32 dwPieceID)
{
	GDlgPiece*	pPiece;

	if(dwPieceID == -1)
		pPiece = m_pDlgPiece;
	else
		pPiece = g_pRPGDataMan->GetDlgPiece(dwPieceID);

	if(pPiece)
		pPiece->ToggleDlgPiece();
}


GDlgPiece* GDialog::GetNextDlgPiece(GDlgPiece* pPiece,U32 nIndex,GCharacter* pChar)
{
	//对话片段切换时,将作以下处理
	//	1.当前Answer为Abort型,则中断
	//	2.当前Answer为End型,则正常结束
	//	3.当前Piece为TaskRun型,则处理当前状态任务
	//	4.执行当前Piece的ExecuteCmd,按结果返回 arNext或arNext2片段
	//	5.对话结束时,清除当前状态任务的状态

	GDlgAnswer* pAnswer;
	BOOL			bResult;
	GDlgPiece*	pPieceRet;
	BOOL			bAbort;

	bAbort = FALSE;
	if(!dynamic_cast<GDlgPiece*>(pPiece) || nIndex >= GDLG_ANSWER_NUM)
	{	
		pPieceRet = NULL;
		goto laEnd;
	}
	
	pAnswer = pPiece->GetAnswer(nIndex);
	if(!pAnswer || pAnswer->IsAbort())
	{	
		bAbort = TRUE;
		pPieceRet = NULL;
		goto laEnd;
	}
	
	//////////////////////////
	//处理任务状态
	if(pPiece->IsTaskRun())
	{
		g_pRPGPlayerAux->SetTaskRun();
		bResult = GTaskState::RunTaskState(g_pGNpc,g_pGPlayer);
		//GTaskState::ToggleTaskState(NULL,NULL,GTS_NULL,NULL,NULL);
		if(!bResult)
		{
			pPieceRet = NULL;
			goto laEnd;
		}
	}//if


	//////////////////////////////
	//执行Piece指令
	bResult = pPiece->ExecuteCmd(pChar);
	if(pAnswer->IsEnd())
	{	
		pPieceRet = NULL;
		goto laEnd;
	}


	if(bResult)
		pPieceRet = pPiece->m_arNexts[nIndex];
	else
		pPieceRet = pPiece->m_arNext2s[nIndex];


laEnd:
	//对话结束,清除状态任务的状态
	if(pPieceRet == NULL)
	{
		if(!bAbort && !g_pRPGPlayerAux->IsTaskRun())
		{
			GTaskState::RunTaskState(g_pGNpc,g_pGPlayer);//没有TaskRun的话
		}

		g_pRPGPlayerAux->ClearTaskRun();
		GTaskState::ToggleTaskState(NULL,NULL,GTS_NULL,NULL,NULL);
	}
	return pPieceRet;
}





void GDialog::initPersistFields()
{
	Parent::initPersistFields();
}


ConsoleMethod(GDialog, ToggleDlgPiece, void, 2, 3, ".ToggleDlgPiece(PieceID)")
{
	U32 dwID;
	if(argc == 2)
		dwID = -1;
	else
		dwID = dAtoi(argv[2]);

	object->ToggleDlgPiece(dwID);
}



//void GDialog::consoleInit()
//{
//}


/////////////////////////////////////////////////////////////
//CONSOLEMETHOD_GOODS_U32(GoodsName,"GoodsName");

};//namespace RPG

⌨️ 快捷键说明

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