📄 rpgtextparse.cc
字号:
//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 + -