UiChatPhrase.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:14k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*****************************************************************************************
  2. // 界面--聊天快捷输入短语
  3. // Copyright : Kingsoft 2003
  4. // Author :   Wooy(Wu yue)
  5. // CreateTime: 2003-3-23
  6. *****************************************************************************************/
  7. #include "KWin32.h"
  8. #include "KIniFile.h"
  9. #include "Uichatphrase.h"
  10. #include "UiBase.h"
  11. #include "elem/wndwindow.h"
  12. #include "ShortcutKey.h"
  13. #include "../../Engine/Src/Text.h"
  14. #include <crtdbg.h>
  15. #define EMOTE_INI_FILE "\Ui\聊天动作.ini"
  16. //构造在调用ShortcutKey::LuaRegisterFunctionAlias注册SayEmote函数别名时所需参数的定义
  17. #define SAY_EMOTE_FUNCTION "SayEmote"
  18. #define SAY_EMOTE_PARAM_DEST_PLAYER "GetRecentPlayerName()"
  19. #define SAY_EMOTE_PARAM_DEST_CHANNEL "GetCurrentChannelName()"
  20. //////////////////////////////////////////////////////////////////////////////
  21. KUiChatPhrase g_UiChatPhrase;
  22. KUiChatPhrase::KUiChatPhrase()
  23. {
  24. m_pEmotePhrase = NULL;
  25. m_pMenuEmote   = NULL;
  26. m_nEmotePhraseCount = 0;
  27. m_nMenuEmoteCount   = 0;
  28. ClearAllPhrase();
  29. }
  30. KUiChatPhrase::~KUiChatPhrase()
  31. {
  32. if(m_pEmotePhrase)
  33. {
  34. delete(m_pEmotePhrase);
  35. m_pEmotePhrase = NULL;
  36. }
  37. if(m_pMenuEmote)
  38. {
  39. delete(m_pMenuEmote);
  40. m_pMenuEmote = NULL;
  41. }
  42. }
  43. void KUiChatPhrase::ClearAllPhrase()
  44. {
  45. memset(&m_PhraseList, 0, sizeof(m_PhraseList));
  46. }
  47. int KUiChatPhrase::GetPhrase(int nIndex, char* pszPhrase)
  48. {
  49. if (nIndex >= 0 && nIndex < MAX_PHRASE_COUNT && pszPhrase)
  50. {
  51. pszPhrase[m_PhraseList[nIndex].nStringLen] = 0;
  52. memcpy(pszPhrase, m_PhraseList[nIndex].szString,
  53. m_PhraseList[nIndex].nStringLen);
  54. return m_PhraseList[nIndex].nStringLen;
  55. }
  56. return 0;
  57. }
  58. int KUiChatPhrase::SetPhrase(int nIndex, char* pszPhrase, int nLen)
  59. {
  60. if (nIndex >= 0 && nIndex < MAX_PHRASE_COUNT)
  61. {
  62. m_PhraseList[nIndex].szString[0] = 0;
  63. m_PhraseList[nIndex].nStringLen = 0;
  64. if (pszPhrase && nLen && nLen <= 64)
  65. {
  66. memcpy(m_PhraseList[nIndex].szString, pszPhrase, nLen);
  67. m_PhraseList[nIndex].nStringLen = nLen;
  68. m_PhraseList[nIndex].szString[nLen] = 0;
  69. }
  70. return nLen;
  71. }
  72. return 0;
  73. }
  74. int KUiChatPhrase::GetPhraseCount()
  75. {
  76. return MAX_PHRASE_COUNT;
  77. }
  78. int KUiChatPhrase::SavePrivateSetting(KIniFile* pFile, LPCSTR lpSection, int nStart)
  79. {
  80. int i = nStart;
  81. char szKey[10];
  82. char szLine[256];
  83. for (; i - nStart < MAX_PHRASE_COUNT; i++)
  84. {
  85. sprintf(szKey, "%d", i);
  86. sprintf(szLine, "SetPhrase(%d, "%s")", i - nStart, m_PhraseList[i - nStart].szString);
  87. pFile->WriteString(lpSection, szKey, szLine);
  88. }
  89. return i;
  90. }
  91. /************************************************************************
  92. * 载入所有的聊天表情动作文件
  93. *************************************************************************/
  94. int KUiChatPhrase::LoadEntireEmote()
  95. {
  96. KIniFile Ini;
  97. if(Ini.Load(EMOTE_INI_FILE))
  98. {
  99. char szBuf[32];
  100. Ini.GetString ("Main", "MyNameColor", "0,0,0", szBuf, sizeof(szBuf));
  101. m_uMyNameColor = GetColor(szBuf);
  102. Ini.GetString ("Main", "TargetColor", "0,0,0", szBuf, sizeof(szBuf));
  103. m_uTargetColor = GetColor(szBuf);
  104.     LoadEmotePhrase(&Ini);
  105.     LoadMenuEmote(&Ini);
  106. }
  107. return 1;
  108. }
  109. /************************************************************************
  110. * 功能:设置聊天动作,有给出index的就改index的,没有就根据Cmd寻找要替换的
  111. *************************************************************************/
  112. int KUiChatPhrase::SetEmote(char *szCmd, char *szName, char *szStringTarget, char *szStringSelf, int nIndex)
  113. {
  114. if(szCmd && szName && szStringTarget && szStringSelf && szCmd[0])
  115. {
  116.      int nIdx;
  117.      if(nIndex == -1)
  118.      {
  119.     if((nIdx = FindEmote(EMOTE_T_MENU, szCmd)) == -1)
  120.     {
  121.      if((nIdx = FindEmote(EMOTE_T_PHRASE, szCmd)) == -1)
  122.     return -1;
  123.     }
  124.     }
  125.     else
  126.     {
  127.      if(nIndex < 0 || nIndex > (m_nMenuEmoteCount + m_nEmotePhraseCount))
  128.     return -1;
  129.     nIdx = nIndex;
  130.     }
  131.     EMOTE_PHRASE *pData;
  132.     if(nIdx >= m_nMenuEmoteCount)
  133.     {
  134.      nIdx -= m_nMenuEmoteCount;
  135.     pData = m_pEmotePhrase;
  136.     }
  137.     else
  138.     {
  139.      pData = m_pMenuEmote;
  140.      }
  141.     memcpy(pData[nIdx].szCmd, szCmd, strlen(szCmd) + 1);
  142.     memcpy(pData[nIdx].szName, szName, strlen(szName) + 1);
  143.     memcpy(pData[nIdx].szString, szStringTarget, strlen(szStringTarget) + 1);
  144.     memcpy(pData[nIdx].szStringMe, szStringSelf, strlen(szStringSelf) + 1);
  145.     pData[nIdx].nStringLen = strlen(szStringTarget);
  146.     pData[nIdx].nStringMeLen = strlen(szStringSelf);
  147.     pData[nIdx].nNameLen = strlen(szName);
  148.     return 1;
  149. }
  150. return -1;
  151. }
  152. /************************************************************************
  153. * 功能:载入一般聊天表情动作文件
  154. *************************************************************************/
  155. int KUiChatPhrase::LoadEmotePhrase(KIniFile *pIni)
  156. {
  157. int  nCount;
  158. pIni->GetInteger("Phrase", "Count", 0, &nCount);
  159. if(m_pEmotePhrase)
  160. {
  161.         delete(m_pEmotePhrase);
  162. m_pEmotePhrase = NULL;
  163. }
  164. m_pEmotePhrase = new EMOTE_PHRASE[nCount];
  165. if(m_pEmotePhrase)
  166. {
  167. m_nEmotePhraseCount = nCount;
  168.         HandleLoad(pIni, m_pEmotePhrase, nCount, "Phrase");
  169. }
  170. return 1;
  171. }
  172. /************************************************************************
  173. * 功能:载入ALT右键菜单的聊天表情动作文件
  174. *************************************************************************/
  175. int KUiChatPhrase::LoadMenuEmote(KIniFile *pIni)
  176. {
  177. int  nCount;
  178. pIni->GetInteger("Menu", "Count", 0, &nCount);
  179. if(m_pMenuEmote)
  180. {
  181.         delete(m_pMenuEmote);
  182. m_pMenuEmote = NULL;
  183. }
  184. m_pMenuEmote = new EMOTE_PHRASE[nCount];
  185. if(m_pMenuEmote)
  186. {
  187. m_nMenuEmoteCount = nCount;
  188.     HandleLoad(pIni, m_pMenuEmote, nCount, "Menu");
  189. }
  190. return 1;
  191. }
  192. /************************************************************************
  193. * 功能:载入数据的文件
  194. *************************************************************************/
  195. int KUiChatPhrase::HandleLoad(KIniFile *pIni, EMOTE_PHRASE *pData, int nCount, const char *szSection)
  196. {
  197. int i;
  198. char szKey[32];
  199. if(pData)
  200. {
  201.     for(i = 0;i < nCount;i++)
  202.     {
  203. sprintf(szKey, "%d_Name", i);
  204.     pIni->GetString(szSection, szKey, "", pData[i].szName, 
  205.              sizeof(pData[i].szName));
  206. pData[i].nNameLen = strlen(pData[i].szName);
  207.      sprintf(szKey, "%d_String", i);
  208.     pIni->GetString(szSection, szKey, "", pData[i].szString, 
  209.              sizeof(pData[i].szString));
  210. pData[i].nStringLen = TEncodeText(pData[i].szString, 
  211.                          strlen(pData[i].szString));
  212. sprintf(szKey, "%d_StringOnlyMe", i);
  213.     pIni->GetString(szSection, szKey, "", pData[i].szStringMe, 
  214.              sizeof(pData[i].szStringMe));
  215. pData[i].nStringMeLen = TEncodeText(pData[i].szStringMe, 
  216.                          strlen(pData[i].szStringMe));
  217. sprintf(szKey, "%d_Command", i);
  218. pIni->GetString(szSection, szKey, "", pData[i].szCmd, 
  219.              sizeof(pData[i].szCmd));
  220.     }
  221. }
  222. return 1;
  223. }
  224. /************************************************************************
  225. * 功能:把读取到的Emote信息构造进去Shortcut系统中的函数别名表
  226. *************************************************************************/
  227. int KUiChatPhrase::ConstructFunctionAlias()
  228. {
  229. int i;
  230. char Buf[8];
  231. PARAMLIST PmList;
  232. for(i = 0;i<m_nMenuEmoteCount;i++)
  233. {
  234. PmList.clear();
  235. PmList.push_back(SAY_EMOTE_PARAM_DEST_PLAYER);
  236. PmList.push_back(SAY_EMOTE_PARAM_DEST_CHANNEL);
  237. PmList.push_back(itoa(i, Buf, 10));
  238. KShortcutKeyCentre::RegisterFunctionAlias(m_pMenuEmote[i].szCmd, "SayEmote", 3, PmList);
  239. }
  240. for(i = 0;i<m_nEmotePhraseCount;i++)
  241. {
  242. PmList.clear();
  243. PmList.push_back(SAY_EMOTE_PARAM_DEST_PLAYER);
  244. PmList.push_back(SAY_EMOTE_PARAM_DEST_CHANNEL);
  245. PmList.push_back(itoa(i + m_nMenuEmoteCount, Buf, 10));
  246. KShortcutKeyCentre::RegisterFunctionAlias(m_pEmotePhrase[i].szCmd, "SayEmote", 3, PmList);
  247. }
  248. return 1;
  249. }
  250. /************************************************************************
  251. * 功能:取得某种表情动作的个数
  252. *************************************************************************/
  253. int KUiChatPhrase::GetEmoteCount(EMOTE_TYPE eType)
  254. {
  255. if(eType == EMOTE_T_PHRASE)
  256. {
  257. return m_nEmotePhraseCount;
  258. }
  259. else
  260. {
  261. return m_nMenuEmoteCount;
  262. }
  263. }
  264. /************************************************************************
  265. * 功能:根据命令获取一个动作描述(pBuff),返回描述长度,
  266. *       这里是包括了MENU和PHRASE的
  267. *************************************************************************/
  268. int KUiChatPhrase::GetEmote(const char *szCmd, char *pBuff, int nBuffLen, int nType)
  269. {
  270. int nIndex;
  271. if((nIndex = GetMenuEmote(szCmd, pBuff, nBuffLen, nType)) > 0)
  272. return nIndex;
  273. nIndex = FindEmote(EMOTE_T_PHRASE, szCmd);
  274. return GetEmote(nIndex, pBuff, nBuffLen, nType);
  275. }
  276. //上面的多态
  277. /************************************************************************
  278. * 功能:根据索引获取一个动作描述(pBuff),返回描述长度,
  279. *       这里是包括了MENU和PHRASE的
  280. *************************************************************************/
  281. int KUiChatPhrase::GetEmote(int nIndex, char *pBuff, int nBuffLen, int nType)
  282. {
  283. if(nIndex >= 0 && nIndex < (m_nEmotePhraseCount + m_nMenuEmoteCount) &&
  284. m_pEmotePhrase && nBuffLen >= m_pEmotePhrase[nIndex].nStringLen)
  285. {
  286. if(nIndex < m_nMenuEmoteCount)
  287. {
  288. return GetMenuEmote(nIndex, pBuff, nBuffLen, nType);
  289. }
  290. else
  291. {
  292. nIndex -= m_nMenuEmoteCount;
  293.      if(nType == 0)
  294.     {
  295.      memcpy(pBuff, m_pEmotePhrase[nIndex].szString, m_pEmotePhrase[nIndex].nStringLen);
  296.     return m_pEmotePhrase[nIndex].nStringLen;
  297.     }
  298.     else
  299.     {
  300.      memcpy(pBuff, m_pEmotePhrase[nIndex].szStringMe, m_pEmotePhrase[nIndex].nStringMeLen);
  301.     return m_pEmotePhrase[nIndex].nStringMeLen;
  302.     }
  303. }
  304. }
  305. else
  306. {
  307. pBuff[0] = 0;
  308. return 0;
  309. }
  310. }
  311. /**************************************************************************
  312. * 功能:根据命令获取一个用于菜单上的动作描述(pBuff),返回描述长度,仅仅MENU
  313. ***************************************************************************/
  314. int KUiChatPhrase::GetMenuEmote(const char *szCmd, char *pBuff, int nBuffLen, int nType)
  315. {
  316. int nIndex = FindEmote(EMOTE_T_MENU, szCmd);
  317. return GetMenuEmote(nIndex, pBuff, nBuffLen, nType);
  318. }
  319. //上面的多态
  320. /**************************************************************************
  321. * 功能:根据索引获取一个用于菜单上的动作描述(pBuff),返回描述长度,仅仅MENU
  322. ***************************************************************************/
  323. int KUiChatPhrase::GetMenuEmote(int nIndex, char *pBuff, int nBuffLen, int nType)
  324. {
  325. if(nIndex >= 0 && nIndex < m_nMenuEmoteCount && m_pMenuEmote &&
  326.    nBuffLen >= m_pMenuEmote[nIndex].nStringLen)
  327. {
  328.         if(nType == 0)
  329. {
  330.      memcpy(pBuff, m_pMenuEmote[nIndex].szString, m_pMenuEmote[nIndex].nStringLen);
  331.      return m_pMenuEmote[nIndex].nStringLen;
  332. }
  333. else
  334. {
  335. memcpy(pBuff, m_pMenuEmote[nIndex].szStringMe, m_pMenuEmote[nIndex].nStringMeLen);
  336.      return m_pMenuEmote[nIndex].nStringMeLen;
  337. }
  338. }
  339. else
  340. {
  341. pBuff[0] = 0;
  342. return 0;
  343. }
  344. }
  345. /************************************************************************
  346. * 功能:取出指定索引的动作名字
  347. *************************************************************************/
  348. int KUiChatPhrase::GetMenuEmoteName(int nIndex, char *pBuff, int nBuffLen)
  349. {
  350. if(nIndex >= 0 && nIndex < m_nMenuEmoteCount && m_pMenuEmote &&
  351.    nBuffLen >= m_pMenuEmote[nIndex].nNameLen)
  352. {
  353. memcpy(pBuff, m_pMenuEmote[nIndex].szName, m_pMenuEmote[nIndex].nNameLen);
  354. return m_pMenuEmote[nIndex].nNameLen;
  355. }
  356. else
  357. {
  358. pBuff[0] = 0;
  359. return 0;
  360. }
  361. }
  362. /************************************************************************
  363. * 功能:寻找一个命令所对应的表情数据的索引
  364. *************************************************************************/
  365. int KUiChatPhrase::FindEmote(EMOTE_TYPE eType, const char *szCmd)
  366. {
  367. int i = -1, nCount, nBaseIndex;
  368. EMOTE_PHRASE *pData;
  369. if(eType == EMOTE_T_PHRASE)
  370. {
  371. pData = m_pEmotePhrase;
  372. nCount = m_nEmotePhraseCount;
  373. nBaseIndex = m_nMenuEmoteCount;
  374. }
  375. else
  376. {
  377. nBaseIndex = 0;
  378. pData = m_pMenuEmote;
  379. nCount = m_nMenuEmoteCount;
  380. }
  381. if(pData)
  382. {
  383. for(i = 0;i < nCount;i++)
  384. {
  385. if(strcmp(pData[i].szCmd, szCmd) == 0)
  386. break;
  387. }
  388. if(i >= nCount)
  389. i = -1;
  390. }
  391. return nBaseIndex + i;
  392. }
  393. /************************************************************************
  394. * 功能:制作字符串
  395. *************************************************************************/
  396. int KUiChatPhrase::ConvertEmoteString(char *szString, int nStringLen, const char *szMyName, const char *szTarName)
  397. {
  398. int nLen, i = 0, nNewMyNameLen, nNewTarNameLen;
  399. char szNewMyName[32], szNewTarName[32];
  400. szNewMyName[0] = KTC_COLOR;
  401. *(int *)(szNewMyName + 1) = m_uMyNameColor;
  402. nNewMyNameLen = strlen(szMyName);
  403. memcpy(szNewMyName + 4, szMyName, nNewMyNameLen);
  404. szNewMyName[4 + nNewMyNameLen] = KTC_COLOR_RESTORE;
  405. nNewMyNameLen += 5;
  406. szNewTarName[0] = KTC_COLOR;
  407. *(int *)(szNewTarName + 1) = m_uTargetColor;
  408. nNewTarNameLen = strlen(szTarName);
  409. memcpy(szNewTarName + 4, szTarName, nNewTarNameLen);
  410. szNewTarName[4 + nNewTarNameLen] = KTC_COLOR_RESTORE;
  411. nNewTarNameLen += 5;
  412. memmove(szString + 1, szString, nStringLen);
  413. szString[0] = 't';
  414. nStringLen ++;
  415. nLen = nStringLen;
  416. while(1)
  417. {
  418. i = TFindSpecialCtrlInEncodedText(szString, nLen, i, '$');
  419. if(i != -1 && szString[i + 1] == 'N')
  420. {
  421. memmove(szString + nNewMyNameLen + i, szString + i + 2, nLen - i - 2);
  422. memcpy(szString + i, szNewMyName, nNewMyNameLen);
  423. nLen += (nNewMyNameLen - 2);
  424. i += (nNewMyNameLen - 2);
  425. }
  426. else if(i == -1)
  427. {
  428. break;
  429. }
  430. else
  431. {
  432. i++;
  433. }
  434. };
  435. i = 0;
  436.     while(1)
  437. {
  438. i = TFindSpecialCtrlInEncodedText(szString, nLen, i, '$');
  439. if(i != -1 && szString[i + 1] == 'n')
  440. {
  441. memmove(szString + nNewTarNameLen + i, szString + i + 2, nLen - 2);
  442. memcpy(szString + i, szNewTarName, nNewTarNameLen);
  443. nLen += (nNewTarNameLen - 2);
  444. i += (nNewTarNameLen - 2);
  445. }
  446. else if(i == -1)
  447. {
  448. break;
  449. }
  450. else
  451. {
  452. i++;
  453. }
  454. };
  455. return nLen;
  456. }