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

📄 rpgtextparse.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
📖 第 1 页 / 共 2 页
字号:
//RPGTextParse.cc
/*/////////////////////////////////////////////////////////////////

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


#include "platform/platform.h"
#include "rpg/RPGTextParse.h"
#include "rpg/RPGSetting.h"
#include "console/consoleTypes.h"
//#include "console/macroManager.h"
#include "rpg/gobjects/GPlayer.h"
#include "rpg/gobjects/GNpc.h"
#include "rpg/gobjects/GScene.h"
#include "rpg/RPGSetting.h"
//#include "console/stringStack.h"
#include "rpg/gobjects/GTaskState.h"
#include "rpg/RPGDialog.h"




namespace RPG
{

//static StringStack	m_textPool;
RPGTextParse* g_pRPGTextParse = NULL;

#define PATH_EXPS				"ui/exps"
#define TEXTENTRY_NUM		sizeof(gs_arTextEntrys)/sizeof(RPGTextParse::TextEntry)

///////////////////////////////////////////////////////////////
static RPGTextParse::TextEntry gs_arTextEntrys[]=
{

	{"tab",			TXTT_TAG,			"tab"},
	{"img",			TXTT_TAG2,			"bitmap:ui/img/"},
	{"align",		TXTT_TAG,			"just"},
	{"icon",			TXTT_TAG,			"icon"},
	{"lineh",		TXTT_TAG,			"lnheight"},
	{"charWidth",	TXTT_TAG,			"charWidth"},
	{"br",			TXTT_TAG,			"br"},
	{"font",			TXTT_TAG,			"font"},
	{"shadow",		TXTT_TAG,			"shadow"},
	{"bitmap",		TXTT_TAG,			"bitmap"},
	{"anchor",		TXTT_TAG,			"a"},
	{"color",		TXTT_TAG,			"color"},
	{"unanchor",	TXTT_TAGEND,		"a"},
	{"acmd",			TXTT_TAG2,			"a:@"},
	{"unacmd",		TXTT_TAGEND,		"a"},
	{"marginl",		TXTT_TAG,			"lmargin"},
	{"marginr",		TXTT_TAG,			"rmargin"},

	{"clrshw",		TXTT_COLORMODE,	"shadowcolor"},
	{"clrtxt",		TXTT_COLORMODE,	"color"},
	{"clrlnk",		TXTT_COLORMODE,	"linkcolor"},
	{"clrhl",		TXTT_COLORMODE,	"linkcolorhl"},

	{"@",				TXTT_COLOR,		"@"},
	{"clr",			TXTT_COLOR,		"."},
	{"rgb",			TXTT_COLOR,		"."},
	{"rgba",			TXTT_COLOR,		"."},
	{"red",			TXTT_COLOR,		"ff0000ff"},
	{"green",		TXTT_COLOR,		"00ff00ff"},
	{"blue",			TXTT_COLOR,		"0000ffff"},
	{"cyan",			TXTT_COLOR,		"00ffffff"},
	{"purple",		TXTT_COLOR,		"ff00ffff"},
	{"yellow",		TXTT_COLOR,		"ffff00ff"},
	{"black",		TXTT_COLOR,		"000000ff"},
	{"white",		TXTT_COLOR,		"ffffffff"},
	{"gray",			TXTT_COLOR,		"7f7f7fff"},
	{"grayw",		TXTT_COLOR,		"b0b0b0ff"},
	{"grayb",		TXTT_COLOR,		"505050ff"},
	{"penwrite",	TXTT_COLOR,		"00ffffff"},

	{"dance",		TXTT_ACTION,	"dance"},
	{"disagree",	TXTT_ACTION,	"disagree"},
	{"agree",		TXTT_ACTION,	"agree"},


	{"SceneName",		TXTT_SCENE,		"sceneName"},
	{"SceneDesc",		TXTT_SCENE,		"sceneDesc"},
	{"SceneIDName",	TXTT_SCENE,		"sceneIDName"},
	{"GameName",		TXTT_GAME,		"gameName"},
	{"NPCName",			TXTT_NPC,		"charName"},
	{"NPCLevel",		TXTT_NPC,		"charLevel"},
	{"PlayerName",		TXTT_PLAYER,	"charName"},
	{"PlayerLevel",	TXTT_PLAYER,	"charLevel"},
	{"DialogCmd",	TXTT_DIALOG,	"*GetPieceCmdText"},
	{"GoodsFrom",	TXTT_GOODS,		"*GetGoodsFromNpcName"},
	{"GoodsTo",		TXTT_GOODS,		"*GetGoodsToNpcName"},


	{"ToNpc",				TXTT_TASK,		GTFIELD_TONPC},
	{"ToNpcPos",			TXTT_TASK,		GTFIELD_TONPCPOS},
	{"FromNpc",				TXTT_TASK,		GTFIELD_FROMNPC},
	{"FromNpcPos",			TXTT_TASK,		GTFIELD_FROMNPCPOS},
	{"GoalObj",				TXTT_TASK,		GTFIELD_GOALOBJ},
	{"GoalObjReq",			TXTT_TASK,		GTFIELD_GOALOBJREQ},

	{"TaskGoal",			TXTT_TASK,		GTFIELD_TASKGOAL},
	{"TaskRequire",		TXTT_TASK,		GTFIELD_TASKREQ},
	{"TaskGoalReq",		TXTT_TASK,		GTFIELD_TASKGOALREQ},
	{"TaskPremium",		TXTT_TASK,		GTFIELD_TASKPREMIUM},
	{"TaskPremiumReq",	TXTT_TASK,		GTFIELD_TASKPREMIUMREQ},

	{"TPieceGoal",			TXTT_TASK,		GTFIELD_TPIECEGOAL},
	{"TPieceGoalReq",		TXTT_TASK,		GTFIELD_TPIECEGOALREQ},
	{"TPieceRequire",		TXTT_TASK,		GTFIELD_TPIECEREQ},
	{"TPiecePremium",		TXTT_TASK,		GTFIELD_TPIECEPREMIUM},
	{"TPiecePremiumReq",	TXTT_TASK,		GTFIELD_TPIECEPREMIUMREQ},

	//{"temp",			TXTT_GVAR,		"$RPG:Temp"},

	{"toyou",		TXTT_ICON,		NULL},
	{"tome",			TXTT_ICON,		NULL},
	{"tip",			TXTT_ICON,		NULL},
	{"system",		TXTT_ICON,		NULL},
	{"cool",			TXTT_ICON,		NULL},
	{"buli",			TXTT_ICON,		NULL},
	{"dlgend",		TXTT_ICON,		NULL},
	{"dlgabort",	TXTT_ICON,		NULL}

};


///////////////////////////////////////////////////////////////
//数据初始化
class RPGTextParseData : public SimDataBlock
{
	typedef SimDataBlock Parent;
public:
	bool preload(bool bServer, char errorBuf[]);
	DECLARE_CONOBJECT(RPGTextParseData);
};

IMPLEMENT_CONOBJECT(RPGTextParseData);

bool RPGTextParseData::preload(bool bServer, char errorBuf[])
{
	//if(!bServer)
	//	return true;
   //if(!Parent::preload(server, errorBuffer))
   //   return false;
	if(g_pRPGTextParse == NULL)
	{
		Con::printf("RPGTextParseData创建失败,须先创建RPGTextParse实例");
		return false;
	}

	ERPGTextParseTypes	type;
	StringTableEntry		pData;
	char*						pValue;
	char*						pSpace;

   SimFieldDictionary * fieldDictionary = getFieldDictionary();
   for(SimFieldDictionaryIterator ditr(fieldDictionary); *ditr; ++ditr)
   {
      SimFieldDictionary::Entry * entry = (*ditr);
		if(entry == NULL)
			continue;
		pValue = entry->value;
		if(!pValue || dIsBlank(pValue))
		{
			g_pRPGTextParse->UnregEntry(entry->slotName);
		}
		else
		{
			pSpace = dStrchr(pValue, ' ');
			if(pSpace == NULL)
			{	
				type		= g_pRPGTextParse->GetEntryType(entry->slotName);
			}
			else
			{
				*pSpace++ = 0;
				type		= (ERPGTextParseTypes)dAtoi(pSpace);
			}



			if(type == TXTT_COLOR)
			{
				char		szColor[16];
				U32		nValueLen = dStrlen(pValue);
				if(nValueLen > 8)
					dStrncpy(szColor,pValue,8);
				else if(nValueLen <= 6)
				{	
					//不足7位,则认为不指定Alpha值
					dSprintf(szColor,16,"%6sff",pValue);
				}
				else
					dSprintf(szColor,16,"%8s",pValue);
				szColor[8] = 0;
				//for(pValue = szColor;*pValue == ' '; pValue++) 
				//	*pValue = '0';

				for(pValue = szColor;*pValue; pValue++) 
				{	
					if(!dIshex(*pValue))
						*pValue = '0';
				}

				pData = StringTable->insert(szColor);
			}
			else
			{
				if(pValue[0] == '.' || pValue[0] == 0)
					pData = entry->slotName;
				else
					pData = StringTable->insert(pValue);
			}


			g_pRPGTextParse->RegEntry( entry->slotName, type,  pData);
		}//else
		//删除此字段
		//fieldDictionary->setFieldValue(entry->slotName,"");		

   }//for

//	fieldDictionary->

	return true;
}

///////////////////////////////////////////////////////////////
//构造函数 /析构函数
IMPLEMENT_CONOBJECT(RPGTextParse);

RPGTextParse::RPGTextParse()
:m_arEntrys(HASHSIZE)
,m_arSections(SECTION_NUM)
,m_arColorStack(COLORSTACK_NUM)
{
	m_pExpsPath		= StringTable->insert(PATH_EXPS);
	m_sClrTag		= StringTable->insert("color");
	m_nClrTagLen	= dStrlen(m_sClrTag);

	TextEntry*	pEntry;
	U32 n;
	for(n=0; n<TEXTENTRY_NUM; n++)
	{

		pEntry = m_arEntrys.Insert(gs_arTextEntrys[n].pIDName);
		*pEntry = gs_arTextEntrys[n];
	}

	m_nLevelNum = LEVEL_MAX;

}

RPGTextParse::~RPGTextParse()
{
}


void RPGTextParse::Initialize(CSTR pScriptName)
{
	AssertWarn(g_pRPGTextParse==NULL,"RPGTextParse实例不能创建第2个");

	U32 n;
	for(n=0; n<TEXTENTRY_NUM; n++)
	{
		gs_arTextEntrys[n].pIDName = StringTable->insert(gs_arTextEntrys[n].pIDName);
		if(gs_arTextEntrys[n].pData == NULL || gs_arTextEntrys[n].pData[0] == 0)
			gs_arTextEntrys[n].pData	= gs_arTextEntrys[n].pIDName;
		else
			gs_arTextEntrys[n].pData	= StringTable->insert(gs_arTextEntrys[n].pData);
	}//for


	g_pRPGTextParse = new RPGTextParse();
	g_pRPGTextParse->registerObject(pScriptName);


	//Con::setVariable("$RPG:Temp", "= >/<icon>:<boot01>测试中/red");
	//g_pRPGTextParse->ParseText("/yellow/temp。还好叫/rgb:33ff33");

}

void RPGTextParse::Destroy()
{
	if(g_pRPGTextParse)
	{
		g_pRPGTextParse->deleteObject();
		g_pRPGTextParse = NULL;
	}
}

void RPGTextParse::initPersistFields()
{
	Parent::initPersistFields();
	//addField("chatLogUI",		TypeGuiChatLogPtr,Offset(m_pUIChatLog,RPGTextParse));
	addField("expsPath",		TypeFilename,		Offset(m_pExpsPath,RPGTextParse));
}

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




void  RPGTextParse::RegEntry(StringTableEntry pIDName,ERPGTextParseTypes type, StringTableEntry pData)
{
	if(!pIDName || !pIDName[0])
		return;

	TextEntry* pEntry;
	
	pEntry = m_arEntrys.Insert(pIDName);
	if(type != TXTT_NULL)
		pEntry->dwType = type;
	pEntry->pData	= pData;
}


CSTR 	RPGTextParse::ParseTextF(CSTR sText,...)
{
   static char buffer[10240];

	va_list	args;
   va_start(args, sText);
   dVsprintf(buffer, sizeof(buffer), sText, args);
	va_end(args);

	return ParseText(buffer);
}


CSTR 	RPGTextParse::ParseText(CSTR sText,S32 nLevel)
{
	/*/////////////////////////////////////////////
	%var
	%f.var
	/*/////////////////////////////////////////////

	char		*pSection,
				*pParams;
	const char	*pSlash;
	const char	*pTail;
	const char	*pCurrent,
			*pEntry,
			*pParamPtr,
			*pContent;
	bool	bOperator;

	U32	nSecLen,
			nMax,
			nNameLen,
			nParamsLen,
			n;//	nBufSize(0);
	//char	szVar[256];
	StringTableEntry	sIDName;
	//char	cType;


	//初始化处理
	if(nLevel == -1)
	{

		m_textPool.clear();
		m_arSections.clear();
		m_arColorStack.clear();
		nLevel = m_nLevelNum;
		m_nBufSize	= 0;
	}
	else if(nLevel == 0)
		return NULL;

	if(sText[0] == '=' && sText[1] == '>')
		sText += 2;

	nMax		= dStrlen(sText);
	pCurrent = sText;
	pSlash	= sText;
	pTail		= sText + nMax;
	//////////////////////////////////////////////
	//循环处理字符
	for(; pSlash<pTail;)
	{
		pSlash = dStrchr(pSlash,'/');
		if(pSlash == NULL)
			break;
		
		nSecLen = pSlash - pCurrent;
		pSlash++;
		pEntry		= pSlash;
		pParams		= NULL;
		nParamsLen	= 0;

		if(*pSlash == '/')
		{	
			//处理连续/////符,只消去第一个/符即可
			for(; pSlash<pTail;pSlash++)
			{
				if(*pSlash != '/')
					break;
			}
			nSecLen += pSlash - pEntry;
		}
		else
		{
			//判断是否为 /<entry>  /<entry/n 格式
			if(*pSlash == '<')
			{
				pSlash++;
				pEntry=pSlash;
				for(; pSlash<pTail;pSlash++)
					if(/*dIsslash(*pSlash) ||*/ *pSlash == '\n' || *pSlash == '>')
						break;

				nNameLen = pSlash - pEntry;
				if(*pSlash == '>')
					pSlash++;

⌨️ 快捷键说明

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