📄 gdialog.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 + -