MrP0wers

Untitled

Mar 1st, 2025
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.96 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "PythonChat.h"
  3.  
  4. #include "AbstractApplication.h"
  5. #include "PythonCharacterManager.h"
  6. #include "../eterbase/Timer.h"
  7.  
  8. int CPythonChat::TChatSet::ms_iChatModeSize = CHAT_TYPE_MAX_NUM;
  9.  
  10. const float c_fStartDisappearingTime = 5.0f;
  11. const int c_iMaxLineCount = 5;
  12.  
  13. ///////////////////////////////////////////////////////////////////////////////////////////////////
  14.  
  15. CDynamicPool<CPythonChat::SChatLine> CPythonChat::SChatLine::ms_kPool;
  16.  
  17. void CPythonChat::SetChatColor(UINT eType, UINT r, UINT g, UINT b)
  18. {
  19. if (eType>=CHAT_TYPE_MAX_NUM)
  20. return;
  21.  
  22. DWORD dwColor=(0xff000000)|(r<<16)|(g<<8)|(b);
  23. m_akD3DXClrChat[eType]=D3DXCOLOR(dwColor);
  24. }
  25.  
  26. ///////////////////////////////////////////////////////////////////////////////////////////////////
  27.  
  28. CPythonChat::SChatLine* CPythonChat::SChatLine::New()
  29. {
  30. return ms_kPool.Alloc();
  31. }
  32.  
  33. void CPythonChat::SChatLine::Delete(CPythonChat::SChatLine* pkChatLine)
  34. {
  35. pkChatLine->Instance.Destroy();
  36. ms_kPool.Free(pkChatLine);
  37. }
  38.  
  39. void CPythonChat::SChatLine::DestroySystem()
  40. {
  41. ms_kPool.Destroy();
  42. }
  43.  
  44. void CPythonChat::SChatLine::SetColor(DWORD dwID, DWORD dwColor)
  45. {
  46. assert(dwID < CHAT_LINE_COLOR_ARRAY_MAX_NUM);
  47.  
  48. if (dwID >= CHAT_LINE_COLOR_ARRAY_MAX_NUM)
  49. return;
  50.  
  51. aColor[dwID] = dwColor;
  52. }
  53.  
  54. void CPythonChat::SChatLine::SetColorAll(DWORD dwColor)
  55. {
  56. for (int i = 0; i < CHAT_LINE_COLOR_ARRAY_MAX_NUM; ++i)
  57. aColor[i] = dwColor;
  58. }
  59.  
  60. D3DXCOLOR & CPythonChat::SChatLine::GetColorRef(DWORD dwID)
  61. {
  62. assert(dwID < CHAT_LINE_COLOR_ARRAY_MAX_NUM);
  63.  
  64. if (dwID >= CHAT_LINE_COLOR_ARRAY_MAX_NUM)
  65. {
  66. static D3DXCOLOR color(1.0f, 0.0f, 0.0f, 1.0f);
  67. return color;
  68. }
  69.  
  70. return aColor[dwID];
  71. }
  72.  
  73. CPythonChat::SChatLine::SChatLine()
  74. {
  75. for (int i = 0; i < CHAT_LINE_COLOR_ARRAY_MAX_NUM; ++i)
  76. aColor[i] = 0xff0000ff;
  77. }
  78. CPythonChat::SChatLine::~SChatLine()
  79. {
  80. Instance.Destroy();
  81. }
  82.  
  83. ///////////////////////////////////////////////////////////////////////////////////////////////////
  84.  
  85. int CPythonChat::CreateChatSet(DWORD dwID)
  86. {
  87. m_ChatSetMap.insert(make_pair(dwID, TChatSet()));
  88. return dwID;
  89. }
  90.  
  91. void CPythonChat::UpdateViewMode(DWORD dwID)
  92. {
  93. IAbstractApplication& rApp=IAbstractApplication::GetSingleton();
  94.  
  95. float fcurTime = rApp.GetGlobalTime();
  96. //float felapsedTime = rApp.GetGlobalElapsedTime();
  97.  
  98. TChatSet * pChatSet = GetChatSetPtr(dwID);
  99. if (!pChatSet)
  100. return;
  101.  
  102. TChatLineList * pLineList = &(pChatSet->m_ShowingChatLineList);
  103. int iLineIndex = pLineList->size();
  104. int iHeight = -(int(pLineList->size()+1) * pChatSet->m_iStep);
  105.  
  106. TChatLineList::iterator itor;
  107. for (itor = pLineList->begin(); itor != pLineList->end();)
  108. {
  109. TChatLine * pChatLine = (*itor);
  110.  
  111. D3DXCOLOR & rColor = pChatLine->GetColorRef(dwID);
  112.  
  113. float fElapsedTime = (fcurTime - pChatLine->fAppendedTime);
  114. if (fElapsedTime >= c_fStartDisappearingTime || iLineIndex >= c_iMaxLineCount)
  115. {
  116. rColor.a -= rColor.a / 10.0f;
  117.  
  118. if (rColor.a <= 0.1f)
  119. {
  120. itor = pLineList->erase(itor);
  121. }
  122. else
  123. {
  124. ++itor;
  125. }
  126. }
  127. else
  128. {
  129. ++itor;
  130. }
  131.  
  132. /////
  133.  
  134. iHeight += pChatSet->m_iStep;
  135. --iLineIndex;
  136.  
  137. pChatLine->Instance.SetPosition(pChatSet->m_ix, pChatSet->m_iy + iHeight);
  138. pChatLine->Instance.SetColor(rColor);
  139. pChatLine->Instance.Update();
  140. }
  141. }
  142.  
  143. void CPythonChat::UpdateEditMode(DWORD dwID)
  144. {
  145. TChatSet * pChatSet = GetChatSetPtr(dwID);
  146. if (!pChatSet)
  147. return;
  148.  
  149. const int c_iAlphaLine = max(0, GetVisibleLineCount(dwID) - GetEditableLineCount(dwID) + 2);
  150.  
  151. int iLineIndex = 0;
  152. float fAlpha = 0.0f;
  153. float fAlphaStep = 0.0f;
  154.  
  155. if (c_iAlphaLine > 0)
  156. fAlphaStep = 1.0f / float(c_iAlphaLine);
  157.  
  158. TChatLineList * pLineList = &(pChatSet->m_ShowingChatLineList);
  159. int iHeight = -(int(pLineList->size()+1) * pChatSet->m_iStep);
  160.  
  161. for (TChatLineList::iterator itor = pLineList->begin(); itor != pLineList->end(); ++itor)
  162. {
  163. TChatLine * pChatLine = (*itor);
  164.  
  165. D3DXCOLOR & rColor = pChatLine->GetColorRef(dwID);
  166.  
  167. if (iLineIndex < c_iAlphaLine)
  168. {
  169. rColor.a += (fAlpha - rColor.a) / 10.0f;
  170. fAlpha = fMIN(fAlpha+fAlphaStep, 1.0f);
  171. }
  172.  
  173. else
  174. {
  175. rColor.a = fMIN(rColor.a+0.05f, 1.0f);
  176. }
  177.  
  178. iHeight += pChatSet->m_iStep;
  179. pChatLine->Instance.SetPosition(pChatSet->m_ix, pChatSet->m_iy + iHeight);
  180. pChatLine->Instance.SetColor(rColor);
  181. pChatLine->Instance.Update();
  182. }
  183. }
  184.  
  185. void CPythonChat::UpdateLogMode(DWORD dwID)
  186. {
  187. TChatSet * pChatSet = GetChatSetPtr(dwID);
  188. if (!pChatSet)
  189. return;
  190.  
  191. TChatLineList * pLineList = &(pChatSet->m_ShowingChatLineList);
  192. int iHeight = 0;
  193.  
  194. for (TChatLineList::reverse_iterator itor = pLineList->rbegin(); itor != pLineList->rend(); ++itor)
  195. {
  196. TChatLine * pChatLine = (*itor);
  197.  
  198. iHeight -= pChatSet->m_iStep;
  199. pChatLine->Instance.SetPosition(pChatSet->m_ix, pChatSet->m_iy + iHeight);
  200. pChatLine->Instance.SetColor(pChatLine->GetColorRef(dwID));
  201. pChatLine->Instance.Update();
  202. }
  203. }
  204.  
  205. void CPythonChat::Update(DWORD dwID)
  206. {
  207. TChatSet * pChatSet = GetChatSetPtr(dwID);
  208. if (!pChatSet)
  209. return;
  210.  
  211. switch (pChatSet->m_iBoardState)
  212. {
  213. case BOARD_STATE_VIEW:
  214. UpdateViewMode(dwID);
  215. break;
  216.  
  217. case BOARD_STATE_EDIT:
  218. UpdateEditMode(dwID);
  219. break;
  220.  
  221. case BOARD_STATE_LOG:
  222. UpdateLogMode(dwID);
  223. break;
  224. }
  225.  
  226. DWORD dwcurTime = CTimer::Instance().GetCurrentMillisecond();
  227. for (TWaitChatList::iterator itor = m_WaitChatList.begin(); itor != m_WaitChatList.end();)
  228. {
  229. TWaitChat & rWaitChat = *itor;
  230.  
  231. if (rWaitChat.dwAppendingTime < dwcurTime)
  232. {
  233. AppendChat(rWaitChat.iType, rWaitChat.strChat.c_str());
  234.  
  235. itor = m_WaitChatList.erase(itor);
  236. }
  237.  
  238. else
  239. {
  240. ++itor;
  241. }
  242. }
  243. }
  244.  
  245. void CPythonChat::Render(DWORD dwID)
  246. {
  247. TChatLineList * pLineList = GetChatLineListPtr(dwID);
  248. if (!pLineList)
  249. return;
  250.  
  251. for (TChatLineList::iterator itor = pLineList->begin(); itor != pLineList->end(); ++itor)
  252. {
  253. CGraphicTextInstance & rInstance = (*itor)->Instance;
  254. rInstance.Render();
  255. }
  256. }
  257.  
  258.  
  259. void CPythonChat::SetBoardState(DWORD dwID, int iState)
  260. {
  261. TChatSet * pChatSet = GetChatSetPtr(dwID);
  262. if (!pChatSet)
  263. return;
  264.  
  265. pChatSet->m_iBoardState = iState;
  266. ArrangeShowingChat(dwID);
  267. }
  268. void CPythonChat::SetPosition(DWORD dwID, int ix, int iy)
  269. {
  270. TChatSet * pChatSet = GetChatSetPtr(dwID);
  271. if (!pChatSet)
  272. return;
  273.  
  274. pChatSet->m_ix = ix;
  275. pChatSet->m_iy = iy;
  276. }
  277. void CPythonChat::SetHeight(DWORD dwID, int iHeight)
  278. {
  279. TChatSet * pChatSet = GetChatSetPtr(dwID);
  280. if (!pChatSet)
  281. return;
  282.  
  283. pChatSet->m_iHeight = iHeight;
  284. }
  285. void CPythonChat::SetStep(DWORD dwID, int iStep)
  286. {
  287. TChatSet * pChatSet = GetChatSetPtr(dwID);
  288. if (!pChatSet)
  289. return;
  290.  
  291. pChatSet->m_iStep = iStep;
  292. }
  293. void CPythonChat::ToggleChatMode(DWORD dwID, int iMode)
  294. {
  295. TChatSet * pChatSet = GetChatSetPtr(dwID);
  296. if (!pChatSet)
  297. return;
  298.  
  299. pChatSet->m_iMode[iMode] = 1 - pChatSet->m_iMode[iMode];
  300. // Tracef("ToggleChatMode : %d\n", iMode);
  301. ArrangeShowingChat(dwID);
  302. }
  303. void CPythonChat::EnableChatMode(DWORD dwID, int iMode)
  304. {
  305. TChatSet * pChatSet = GetChatSetPtr(dwID);
  306. if (!pChatSet)
  307. return;
  308.  
  309. pChatSet->m_iMode[iMode] = TRUE;
  310. // Tracef("EnableChatMode : %d\n", iMode);
  311. ArrangeShowingChat(dwID);
  312. }
  313. void CPythonChat::DisableChatMode(DWORD dwID, int iMode)
  314. {
  315. TChatSet * pChatSet = GetChatSetPtr(dwID);
  316. if (!pChatSet)
  317. return;
  318.  
  319. pChatSet->m_iMode[iMode] = FALSE;
  320. // Tracef("DisableChatMode : %d\n", iMode);
  321. ArrangeShowingChat(dwID);
  322. }
  323. void CPythonChat::SetEndPos(DWORD dwID, float fPos)
  324. {
  325. TChatSet * pChatSet = GetChatSetPtr(dwID);
  326. if (!pChatSet)
  327. return;
  328.  
  329. fPos = max(0.0f, fPos);
  330. fPos = min(1.0f, fPos);
  331. if (pChatSet->m_fEndPos != fPos)
  332. {
  333. pChatSet->m_fEndPos = fPos;
  334. ArrangeShowingChat(dwID);
  335. }
  336. }
  337.  
  338. int CPythonChat::GetVisibleLineCount(DWORD dwID)
  339. {
  340. TChatLineList * pLineList = GetChatLineListPtr(dwID);
  341. if (!pLineList)
  342. return 0;
  343.  
  344. return pLineList->size();
  345. }
  346.  
  347. int CPythonChat::GetEditableLineCount(DWORD dwID)
  348. {
  349. TChatSet * pChatSet = GetChatSetPtr(dwID);
  350. if (!pChatSet)
  351. return 0;
  352.  
  353. return pChatSet->m_iHeight / pChatSet->m_iStep + 1;
  354. }
  355.  
  356. int CPythonChat::GetLineCount(DWORD dwID)
  357. {
  358. TChatSet * pChatSet = GetChatSetPtr(dwID);
  359. if (!pChatSet)
  360. return 0;
  361.  
  362. int iCount = 0;
  363. for (DWORD i = 0; i < m_ChatLineDeque.size(); ++i)
  364. {
  365. if (!pChatSet->CheckMode(m_ChatLineDeque[i]->iType))
  366. continue;
  367.  
  368. ++iCount;
  369. }
  370.  
  371. return iCount;
  372. }
  373.  
  374. int CPythonChat::GetLineStep(DWORD dwID)
  375. {
  376. TChatSet * pChatSet = GetChatSetPtr(dwID);
  377. if (!pChatSet)
  378. return 0;
  379.  
  380. return pChatSet->m_iStep;
  381. }
  382.  
  383. CPythonChat::TChatLineList * CPythonChat::GetChatLineListPtr(DWORD dwID)
  384. {
  385. TChatSetMap::iterator itor = m_ChatSetMap.find(dwID);
  386. if (m_ChatSetMap.end() == itor)
  387. return NULL;
  388.  
  389. TChatSet & rChatSet = itor->second;
  390. return &(rChatSet.m_ShowingChatLineList);
  391. }
  392.  
  393. CPythonChat::TChatSet * CPythonChat::GetChatSetPtr(DWORD dwID)
  394. {
  395. TChatSetMap::iterator itor = m_ChatSetMap.find(dwID);
  396. if (m_ChatSetMap.end() == itor)
  397. return NULL;
  398.  
  399. TChatSet & rChatSet = itor->second;
  400. return &rChatSet;
  401. }
  402.  
  403. void CPythonChat::ArrangeShowingChat(DWORD dwID)
  404. {
  405. TChatSet * pChatSet = GetChatSetPtr(dwID);
  406. if (!pChatSet)
  407. return;
  408.  
  409. pChatSet->m_ShowingChatLineList.clear();
  410.  
  411. TChatLineDeque TempChatLineDeque;
  412. for (TChatLineDeque::iterator itor = m_ChatLineDeque.begin(); itor != m_ChatLineDeque.end(); ++itor)
  413. {
  414. TChatLine * pChatLine = *itor;
  415. if (pChatSet->CheckMode(pChatLine->iType))
  416. TempChatLineDeque.push_back(pChatLine);
  417. }
  418.  
  419. int icurLineCount = TempChatLineDeque.size();
  420. int iVisibleLineCount = min(icurLineCount, (pChatSet->m_iHeight + pChatSet->m_iStep) / pChatSet->m_iStep);
  421. int iEndLine = iVisibleLineCount + int(float(icurLineCount - iVisibleLineCount - 1) * pChatSet->m_fEndPos);
  422.  
  423. /////
  424.  
  425. int iHeight = 12;
  426. for (int i = min(icurLineCount-1, iEndLine); i >= 0; --i)
  427. {
  428. if (!pChatSet->CheckMode(TempChatLineDeque[i]->iType))
  429. continue;
  430.  
  431. if (pChatSet->m_iHeight + pChatSet->m_iStep <= iHeight)
  432. {
  433. break;
  434. }
  435.  
  436. pChatSet->m_ShowingChatLineList.push_front(TempChatLineDeque[i]);
  437.  
  438. iHeight += pChatSet->m_iStep;
  439. }
  440. }
  441.  
  442. void CPythonChat::AppendChat(int iType, const char * c_szChat)
  443. {
  444. // DEFAULT_FONT
  445. //static CResource * s_pResource = CResourceManager::Instance().GetResourcePointer(g_strDefaultFontName.c_str());
  446.  
  447. CGraphicText* pkDefaultFont = static_cast<CGraphicText*>(DefaultFont_GetResource());
  448. if (!pkDefaultFont)
  449. {
  450. TraceError("CPythonChat::AppendChat - CANNOT_FIND_DEFAULT_FONT");
  451. return;
  452. }
  453. // END_OF_DEFAULT_FONT
  454.  
  455. IAbstractApplication& rApp=IAbstractApplication::GetSingleton();
  456. SChatLine * pChatLine = SChatLine::New();
  457. pChatLine->iType = iType;
  458. pChatLine->Instance.SetValue(c_szChat);
  459.  
  460. // DEFAULT_FONT
  461. pChatLine->Instance.SetTextPointer(pkDefaultFont);
  462. // END_OF_DEFAULT_FONT
  463.  
  464. pChatLine->fAppendedTime = rApp.GetGlobalTime();
  465. pChatLine->SetColorAll(GetChatColor(iType));
  466.  
  467. m_ChatLineDeque.push_back(pChatLine);
  468. if (m_ChatLineDeque.size() > CHAT_LINE_MAX_NUM)
  469. {
  470. SChatLine * pChatLine = m_ChatLineDeque.front();
  471. SChatLine::Delete(pChatLine);
  472. m_ChatLineDeque.pop_front();
  473. }
  474.  
  475. for (TChatSetMap::iterator itor = m_ChatSetMap.begin(); itor != m_ChatSetMap.end(); ++itor)
  476. {
  477. TChatSet * pChatSet = &(itor->second);
  478. //pChatLine->SetColor(itor->first, GetChatColor(iType));
  479.  
  480. // Edit Mode 를 억지로 끼워 맞추기 위해 추가
  481. if (BOARD_STATE_EDIT == pChatSet->m_iBoardState)
  482. {
  483. ArrangeShowingChat(itor->first);
  484. }
  485.  
  486. else// if (BOARD_STATE_VIEW == pChatSet->m_iBoardState)
  487. {
  488. pChatSet->m_ShowingChatLineList.push_back(pChatLine);
  489. if (pChatSet->m_ShowingChatLineList.size() > CHAT_LINE_MAX_NUM)
  490. {
  491. pChatSet->m_ShowingChatLineList.pop_front();
  492. }
  493. }
  494. }
  495. }
  496.  
  497. void CPythonChat::AppendChatWithDelay(int iType, const char * c_szChat, int iDelay)
  498. {
  499. TWaitChat WaitChat;
  500. WaitChat.iType = iType;
  501. WaitChat.strChat = c_szChat;
  502. WaitChat.dwAppendingTime = CTimer::Instance().GetCurrentMillisecond() + iDelay;
  503. m_WaitChatList.push_back(WaitChat);
  504. }
  505.  
  506. DWORD CPythonChat::GetChatColor(int iType)
  507. {
  508. if (iType<CHAT_TYPE_MAX_NUM)
  509. {
  510. return m_akD3DXClrChat[iType];
  511. }
  512.  
  513. return D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f);
  514. }
  515.  
  516. void CPythonChat::IgnoreCharacter(const char * c_szName)
  517. {
  518. TIgnoreCharacterSet::iterator itor = m_IgnoreCharacterSet.find(c_szName);
  519. // NOTE : 이미 차단 중이라면..
  520. if (m_IgnoreCharacterSet.end() != itor)
  521. {
  522. m_IgnoreCharacterSet.erase(itor);
  523. }
  524. // NOTE : 차단이 되지 않은 캐릭터라면..
  525. else
  526. {
  527. m_IgnoreCharacterSet.insert(c_szName);
  528. }
  529. }
  530.  
  531. BOOL CPythonChat::IsIgnoreCharacter(const char * c_szName)
  532. {
  533. TIgnoreCharacterSet::iterator itor = m_IgnoreCharacterSet.find(c_szName);
  534.  
  535. if (m_IgnoreCharacterSet.end() == itor)
  536. return FALSE;
  537.  
  538. return TRUE;
  539. }
  540.  
  541. CWhisper * CPythonChat::CreateWhisper(const char * c_szName)
  542. {
  543. CWhisper * pWhisper = CWhisper::New();
  544. m_WhisperMap.insert(TWhisperMap::value_type(c_szName, pWhisper));
  545.  
  546. return pWhisper;
  547. }
  548.  
  549. void CPythonChat::AppendWhisper(int iType, const char * c_szName, const char * c_szChat)
  550. {
  551. TWhisperMap::iterator itor = m_WhisperMap.find(c_szName);
  552.  
  553. CWhisper * pWhisper;
  554. if (itor == m_WhisperMap.end())
  555. {
  556. pWhisper = CreateWhisper(c_szName);
  557. }
  558.  
  559. else
  560. {
  561. pWhisper = itor->second;
  562. }
  563.  
  564. pWhisper->AppendChat(iType, c_szChat);
  565. }
  566.  
  567. void CPythonChat::ClearWhisper(const char * c_szName)
  568. {
  569. TWhisperMap::iterator itor = m_WhisperMap.find(c_szName);
  570.  
  571. if (itor != m_WhisperMap.end())
  572. {
  573. CWhisper * pWhisper = itor->second;
  574. CWhisper::Delete(pWhisper);
  575.  
  576. m_WhisperMap.erase(itor);
  577. }
  578. }
  579.  
  580. BOOL CPythonChat::GetWhisper(const char * c_szName, CWhisper ** ppWhisper)
  581. {
  582. TWhisperMap::iterator itor = m_WhisperMap.find(c_szName);
  583.  
  584. if (itor == m_WhisperMap.end())
  585. return FALSE;
  586.  
  587. *ppWhisper = itor->second;
  588.  
  589. return TRUE;
  590. }
  591.  
  592. void CPythonChat::InitWhisper(PyObject * ppyObject)
  593. {
  594. TWhisperMap::iterator itor = m_WhisperMap.begin();
  595. for (; itor != m_WhisperMap.end(); ++itor)
  596. {
  597. std::string strName = itor->first;
  598. PyCallClassMemberFunc(ppyObject, "MakeWhisperButton", Py_BuildValue("(s)", strName.c_str()));
  599. }
  600. }
  601.  
  602. void CPythonChat::__DestroyWhisperMap()
  603. {
  604. TWhisperMap::iterator itor = m_WhisperMap.begin();
  605. for (; itor != m_WhisperMap.end(); ++itor)
  606. {
  607. CWhisper::Delete(itor->second);
  608. }
  609. m_WhisperMap.clear();
  610. }
  611.  
  612. void CPythonChat::Close()
  613. {
  614. TChatSetMap::iterator itor = m_ChatSetMap.begin();
  615. for (; itor != m_ChatSetMap.end(); ++itor)
  616. {
  617. TChatSet & rChatSet = itor->second;
  618. TChatLineList * pLineList = &(rChatSet.m_ShowingChatLineList);
  619. for (TChatLineList::iterator itor = pLineList->begin(); itor != pLineList->end(); ++itor)
  620. {
  621. TChatLine * pChatLine = (*itor);
  622. pChatLine->fAppendedTime = 0.0f;
  623. }
  624. }
  625. }
  626.  
  627. void CPythonChat::Destroy()
  628. {
  629. __DestroyWhisperMap();
  630.  
  631. m_ShowingChatLineList.clear();
  632. m_ChatSetMap.clear();
  633. m_ChatLineDeque.clear();
  634.  
  635. SChatLine::DestroySystem();
  636. CWhisper::DestroySystem();
  637.  
  638. __Initialize();
  639. }
  640.  
  641. void CPythonChat::__Initialize()
  642. {
  643. m_akD3DXClrChat[CHAT_TYPE_TALKING] = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
  644. m_akD3DXClrChat[CHAT_TYPE_INFO] = D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f);
  645. m_akD3DXClrChat[CHAT_TYPE_NOTICE] = D3DXCOLOR(1.0f, 0.902f, 0.730f, 1.0f);
  646. m_akD3DXClrChat[CHAT_TYPE_PARTY] = D3DXCOLOR(0.542f, 1.0f, 0.949f, 1.0f);
  647. m_akD3DXClrChat[CHAT_TYPE_GUILD] = D3DXCOLOR(0.906f, 0.847f, 1.0f, 1.0f);
  648. m_akD3DXClrChat[CHAT_TYPE_COMMAND] = D3DXCOLOR(0.658f, 1.0f, 0.835f, 1.0f);
  649. m_akD3DXClrChat[CHAT_TYPE_SHOUT] = D3DXCOLOR(0.658f, 1.0f, 0.835f, 1.0f);
  650. m_akD3DXClrChat[CHAT_TYPE_WHISPER] = D3DXCOLOR(0xff4AE14A);
  651. m_akD3DXClrChat[CHAT_TYPE_BIG_NOTICE] = D3DXCOLOR(1.0f, 0.902f, 0.730f, 1.0f);
  652. }
  653.  
  654. CPythonChat::CPythonChat()
  655. {
  656. __Initialize();
  657. }
  658.  
  659. CPythonChat::~CPythonChat()
  660. {
  661. assert(m_ChatLineDeque.empty());
  662. assert(m_ShowingChatLineList.empty());
  663. assert(m_ChatSetMap.empty());
  664. assert(m_WhisperMap.empty());
  665. }
  666.  
  667. ///////////////////////////////////////////////////////////////////////////////////////////////////
  668. CDynamicPool<CWhisper> CWhisper::ms_kPool;
  669.  
  670. CWhisper* CWhisper::New()
  671. {
  672. return ms_kPool.Alloc();
  673. }
  674.  
  675. void CWhisper::Delete(CWhisper* pkWhisper)
  676. {
  677. pkWhisper->Destroy();
  678. ms_kPool.Free(pkWhisper);
  679. }
  680.  
  681. void CWhisper::DestroySystem()
  682. {
  683. ms_kPool.Destroy();
  684.  
  685. SChatLine::DestroySystem();
  686. }
  687.  
  688. void CWhisper::SetPosition(float fPosition)
  689. {
  690. m_fcurPosition = fPosition;
  691. __ArrangeChat();
  692. }
  693.  
  694. void CWhisper::SetBoxSize(float fWidth, float fHeight)
  695. {
  696. m_fWidth = fWidth;
  697. m_fHeight = fHeight;
  698.  
  699. for (TChatLineDeque::iterator itor = m_ChatLineDeque.begin(); itor != m_ChatLineDeque.end(); ++itor)
  700. {
  701. TChatLine * pChatLine = *itor;
  702. pChatLine->Instance.SetLimitWidth(fWidth);
  703. }
  704. }
  705.  
  706. void CWhisper::AppendChat(int iType, const char * c_szChat)
  707. {
  708. // DEFAULT_FONT
  709. //static CResource * s_pResource = CResourceManager::Instance().GetResourcePointer(g_strDefaultFontName.c_str());
  710.  
  711. CGraphicText* pkDefaultFont = (iType == CPythonChat::WHISPER_TYPE_GM) ? static_cast<CGraphicText*>(DefaultItalicFont_GetResource()) : static_cast<CGraphicText*>(DefaultFont_GetResource());
  712.  
  713. if (!pkDefaultFont)
  714. {
  715. TraceError("CWhisper::AppendChat - CANNOT_FIND_DEFAULT_FONT");
  716. return;
  717. }
  718. // END_OF_DEFAULT_FONT
  719.  
  720. SChatLine * pChatLine = SChatLine::New();
  721. pChatLine->Instance.SetValue(c_szChat);
  722.  
  723. // DEFAULT_FONT
  724. pChatLine->Instance.SetTextPointer(pkDefaultFont);
  725. // END_OF_DEFAULT_FONT
  726.  
  727. pChatLine->Instance.SetLimitWidth(m_fWidth);
  728. pChatLine->Instance.SetMultiLine(TRUE);
  729.  
  730. #ifdef __WHISPER_FUTURES__
  731. pChatLine->bType = iType;
  732. #endif
  733.  
  734. switch(iType)
  735. {
  736. case CPythonChat::WHISPER_TYPE_SYSTEM:
  737. pChatLine->Instance.SetColor(D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f));
  738. break;
  739.  
  740. case CPythonChat::WHISPER_TYPE_GM:
  741. pChatLine->Instance.SetColor(D3DXCOLOR(1.0f, 0.632f, 0.0f, 1.0f));
  742. break;
  743.  
  744. case CPythonChat::WHISPER_TYPE_CHAT:
  745.  
  746. default:
  747. pChatLine->Instance.SetColor(0xffffffff);
  748. break;
  749. }
  750.  
  751. m_ChatLineDeque.push_back(pChatLine);
  752.  
  753. __ArrangeChat();
  754. }
  755.  
  756. void CWhisper::__ArrangeChat()
  757. {
  758. for (TChatLineDeque::iterator itor = m_ChatLineDeque.begin(); itor != m_ChatLineDeque.end(); ++itor)
  759. {
  760. TChatLine * pChatLine = *itor;
  761. pChatLine->Instance.Update();
  762. }
  763. }
  764.  
  765. void CWhisper::Render(float fx, float fy)
  766. {
  767. float fHeight = fy + m_fHeight;
  768.  
  769. int iViewCount = int(m_fHeight / m_fLineStep) - 1;
  770. int iLineCount = int(m_ChatLineDeque.size());
  771. int iStartLine = -1;
  772.  
  773. if (iLineCount > iViewCount)
  774. {
  775. iStartLine = int(float(iLineCount-iViewCount) * m_fcurPosition) + iViewCount - 1;
  776. }
  777.  
  778. else if (!m_ChatLineDeque.empty())
  779. {
  780. iStartLine = iLineCount - 1;
  781. }
  782.  
  783. RECT Rect = { fx, fy, fx+m_fWidth, fy+m_fHeight };
  784.  
  785. for (int i = iStartLine; i >= 0; --i)
  786. {
  787. assert(i >= 0 && i < int(m_ChatLineDeque.size()));
  788. TChatLine * pChatLine = m_ChatLineDeque[i];
  789.  
  790. WORD wLineCount = pChatLine->Instance.GetTextLineCount();
  791. fHeight -= wLineCount * m_fLineStep;
  792.  
  793. pChatLine->Instance.SetPosition(fx, fHeight);
  794. pChatLine->Instance.Render(&Rect);
  795.  
  796. if (fHeight < fy)
  797. break;
  798. }
  799. }
  800.  
  801. #ifdef __WHISPER_FUTURES__
  802. void CWhisper::Save(const char* c_szMain, const char* c_szName)
  803. {
  804. if (!m_ChatLineDeque.size())
  805. return;
  806.  
  807. //block-list
  808. const std::vector<std::string> m_vecBlackList = {
  809. "[SYSTEM]",
  810. };
  811.  
  812. if (std::find(m_vecBlackList.begin(), m_vecBlackList.end(), c_szName) != m_vecBlackList.end())
  813. return;
  814.  
  815. char chatLogFileName[124];
  816. snprintf(chatLogFileName, sizeof(chatLogFileName), "lib/whisper_temp/%s/%s", c_szMain, c_szName);
  817. FILE* file = fopen(chatLogFileName, "a+");
  818. if (!file)
  819. return;
  820.  
  821. for (DWORD j = 0; j < m_ChatLineDeque.size(); ++j)
  822. {
  823. TChatLine* pChatLine = m_ChatLineDeque[j];
  824. fprintf(file, "%d<!!!>%s\n", pChatLine->bType, pChatLine->Instance.GetText().c_str());
  825. }
  826. fflush(file);
  827. fclose(file);
  828. }
  829.  
  830. void CPythonChat::SaveWhispers()
  831. {
  832. const std::string mainPlayername(CPythonPlayer::Instance().GetName());
  833. for (const auto& [name, pWhisper] : m_WhisperMap)
  834. pWhisper->Save(mainPlayername.c_str(), name.c_str());
  835. }
  836. #endif
  837.  
  838. #ifdef CLEAR_CHAT
  839. void CPythonChat::ClearChat()
  840. {
  841. std::for_each(m_ChatLineDeque.begin(), m_ChatLineDeque.end(), SChatLine::Delete);
  842. m_ChatLineDeque.clear();
  843. m_ShowingChatLineList.clear();
  844. }
  845. #endif
  846.  
  847. void CWhisper::__Initialize()
  848. {
  849. m_fLineStep = 15.0f;
  850. m_fWidth = 300.0f;
  851. m_fHeight = 120.0f;
  852. m_fcurPosition = 1.0f;
  853. }
  854.  
  855. void CWhisper::Destroy()
  856. {
  857. std::for_each(m_ChatLineDeque.begin(), m_ChatLineDeque.end(), SChatLine::Delete);
  858. m_ChatLineDeque.clear();
  859. m_ShowingChatLineList.clear();
  860. }
  861.  
  862. CWhisper::CWhisper()
  863. {
  864. __Initialize();
  865. }
  866.  
  867. CWhisper::~CWhisper()
  868. {
  869. Destroy();
  870. }
  871.  
  872. ///////////////////////////////////////////////////////////////////////////////////////////////////
  873.  
  874. CDynamicPool<CWhisper::SChatLine> CWhisper::SChatLine::ms_kPool;
  875.  
  876. CWhisper::SChatLine* CWhisper::SChatLine::New()
  877. {
  878. return ms_kPool.Alloc();
  879. }
  880.  
  881. void CWhisper::SChatLine::Delete(CWhisper::SChatLine* pkChatLine)
  882. {
  883. pkChatLine->Instance.Destroy();
  884. ms_kPool.Free(pkChatLine);
  885. }
  886.  
  887. void CWhisper::SChatLine::DestroySystem()
  888. {
  889. ms_kPool.Destroy();
  890. }
  891.  
Advertisement
Add Comment
Please, Sign In to add comment