Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
851 lines
23 KiB
C++
851 lines
23 KiB
C++
// GUITextEdit.cpp: implementation of the CGUITextEdit class.
|
||
//
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
#include "ClientMain.h"
|
||
#include "CharacterControl.h"
|
||
#include "GUITextEdit.h"
|
||
#include <string.h>
|
||
#include "BaseGraphicsLayer.h"
|
||
#include <imm.h>
|
||
|
||
CGUITextEdit g_TextEdit;
|
||
WNDPROC OldEditProc;
|
||
|
||
//////////////////////////////////////////////////////////////////////
|
||
// Construction/Destruction
|
||
//////////////////////////////////////////////////////////////////////
|
||
|
||
CGUITextEdit::CGUITextEdit()
|
||
{
|
||
m_lpText = NULL;
|
||
m_hEditBox = NULL;
|
||
m_lCarretPosition = 0;
|
||
m_dwStartChat = 0;
|
||
m_dwStartParty = 0;
|
||
m_dwStartGuild = 0;
|
||
m_dwStartStall = 0;
|
||
m_dwEditMode = EDITMODE_NONE;
|
||
m_dwChatMode = CHATMODE_CHAT;
|
||
}
|
||
|
||
CGUITextEdit::~CGUITextEdit()
|
||
{
|
||
deque<Message *>::iterator it;
|
||
for(it = m_deqChatMessage.begin(); it != m_deqChatMessage.end(); it++)
|
||
{
|
||
delete (*it);
|
||
}
|
||
m_deqChatMessage.clear();
|
||
|
||
for(it = m_deqPartyMessage.begin(); it != m_deqPartyMessage.end(); it++)
|
||
{
|
||
delete (*it);
|
||
}
|
||
m_deqPartyMessage.clear();
|
||
|
||
for(it = m_deqGuildMessage.begin(); it != m_deqGuildMessage.end(); it++)
|
||
{
|
||
delete (*it);
|
||
}
|
||
m_deqGuildMessage.clear();
|
||
|
||
for(it = m_deqStallMessage.begin(); it != m_deqStallMessage.end(); it++)
|
||
{
|
||
delete (*it);
|
||
}
|
||
m_deqStallMessage.clear();
|
||
|
||
if(m_hEditBox)
|
||
{
|
||
SetWindowLong(m_hEditBox, GWL_WNDPROC, (long)OldEditProc);
|
||
DestroyWindow(m_hEditBox);
|
||
m_hEditBox = NULL;
|
||
}
|
||
if(m_lpText) { m_lpText->Release(); m_lpText = NULL; }
|
||
}
|
||
|
||
unsigned long CGUITextEdit::GetStringLength(const char *strString)
|
||
{
|
||
unsigned long i, len = strlen(strString), countx = 0;
|
||
for(i = 0; i < len; i++)
|
||
{
|
||
if(strString[i] & 0x80) { countx += m_dwTextSize[128]; i++; } else { countx += m_dwTextSize[strString[i]]; }
|
||
}
|
||
|
||
return countx;
|
||
}
|
||
|
||
LRESULT APIENTRY EditProc(HWND hWnd, unsigned int uMsg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
if(uMsg == WM_GETDLGCODE)
|
||
return DLGC_WANTALLKEYS;
|
||
|
||
switch(uMsg)
|
||
{
|
||
case WM_KEYDOWN:
|
||
switch(wParam)
|
||
{
|
||
case VK_RETURN:
|
||
if(g_TextEdit.m_dwEditMode == EDITMODE_CHAT)
|
||
{
|
||
::SetFocus(g_ClientMain.m_hWnd);
|
||
} else if(g_TextEdit.m_dwEditMode == EDITMODE_CURPASS)
|
||
{
|
||
g_TextEdit.m_dwEditMode = EDITMODE_NEWPASS;
|
||
g_TextEdit.InitMessage();
|
||
} else if(g_TextEdit.m_dwEditMode == EDITMODE_NEWPASS)
|
||
{
|
||
g_TextEdit.m_dwEditMode = EDITMODE_CURPASS;
|
||
g_TextEdit.InitMessage();
|
||
}
|
||
return 0;
|
||
}
|
||
break;
|
||
|
||
case WM_CHAR:
|
||
switch(wParam)
|
||
{
|
||
case VK_RETURN:
|
||
return 0;
|
||
}
|
||
break;
|
||
}
|
||
|
||
return CallWindowProc(OldEditProc, hWnd, uMsg, wParam, lParam);
|
||
}
|
||
|
||
void CGUITextEdit::Create(HWND hWnd, LPDIRECT3DDEVICE8 lpD3DDevice)
|
||
{
|
||
m_dwTextSize[0] = 0; m_dwTextSize[1] = 6; m_dwTextSize[2] = 6; m_dwTextSize[3] = 6;
|
||
m_dwTextSize[4] = 0; m_dwTextSize[5] = 0; m_dwTextSize[6] = 0; m_dwTextSize[7] = 0;
|
||
m_dwTextSize[8] = 0; m_dwTextSize[9] = 0; m_dwTextSize[10] = 0; m_dwTextSize[11] = 0;
|
||
m_dwTextSize[12] = 0; m_dwTextSize[13] = 0; m_dwTextSize[14] = 0; m_dwTextSize[15] = 0;
|
||
m_dwTextSize[16] = 0; m_dwTextSize[17] = 0; m_dwTextSize[18] = 0; m_dwTextSize[19] = 0;
|
||
m_dwTextSize[20] = 0; m_dwTextSize[21] = 0; m_dwTextSize[22] = 0; m_dwTextSize[23] = 0;
|
||
m_dwTextSize[24] = 0; m_dwTextSize[25] = 0; m_dwTextSize[26] = 0; m_dwTextSize[27] = 0;
|
||
m_dwTextSize[28] = 0; m_dwTextSize[29] = 0; m_dwTextSize[30] = 0; m_dwTextSize[31] = 0;
|
||
|
||
m_dwTextSize[32] = 4; m_dwTextSize[33] = 4; m_dwTextSize[34] = 4; m_dwTextSize[35] = 6;
|
||
m_dwTextSize[36] = 6; m_dwTextSize[37] = 10; m_dwTextSize[38] = 8; m_dwTextSize[39] = 4;
|
||
m_dwTextSize[40] = 5; m_dwTextSize[41] = 5; m_dwTextSize[42] = 6; m_dwTextSize[43] = 6;
|
||
m_dwTextSize[44] = 4; m_dwTextSize[45] = 6; m_dwTextSize[46] = 4; m_dwTextSize[47] = 6;
|
||
m_dwTextSize[48] = 6; m_dwTextSize[49] = 6; m_dwTextSize[50] = 6; m_dwTextSize[51] = 6;
|
||
m_dwTextSize[52] = 6; m_dwTextSize[53] = 6; m_dwTextSize[54] = 6; m_dwTextSize[55] = 6;
|
||
m_dwTextSize[56] = 6; m_dwTextSize[57] = 6; m_dwTextSize[58] = 4; m_dwTextSize[59] = 4;
|
||
m_dwTextSize[60] = 8; m_dwTextSize[61] = 6; m_dwTextSize[62] = 8; m_dwTextSize[63] = 6;
|
||
m_dwTextSize[64] = 12; m_dwTextSize[65] = 8; m_dwTextSize[66] = 8; m_dwTextSize[67] = 9;
|
||
m_dwTextSize[68] = 8; m_dwTextSize[69] = 8; m_dwTextSize[70] = 7; m_dwTextSize[71] = 9;
|
||
m_dwTextSize[72] = 8; m_dwTextSize[73] = 3; m_dwTextSize[74] = 4; m_dwTextSize[75] = 8;
|
||
m_dwTextSize[76] = 7; m_dwTextSize[77] = 11; m_dwTextSize[78] = 9; m_dwTextSize[79] = 9;
|
||
m_dwTextSize[80] = 8; m_dwTextSize[81] = 9; m_dwTextSize[82] = 8; m_dwTextSize[83] = 8;
|
||
m_dwTextSize[84] = 8; m_dwTextSize[85] = 8; m_dwTextSize[86] = 8; m_dwTextSize[87] = 10;
|
||
m_dwTextSize[88] = 8; m_dwTextSize[89] = 8; m_dwTextSize[90] = 8; m_dwTextSize[91] = 6;
|
||
m_dwTextSize[92] = 11; m_dwTextSize[93] = 6; m_dwTextSize[94] = 6; m_dwTextSize[95] = 6;
|
||
m_dwTextSize[96] = 4; m_dwTextSize[97] = 7; m_dwTextSize[98] = 7; m_dwTextSize[99] = 7;
|
||
m_dwTextSize[100] = 7; m_dwTextSize[101] = 7; m_dwTextSize[102] = 3; m_dwTextSize[103] = 7;
|
||
m_dwTextSize[104] = 7; m_dwTextSize[105] = 3; m_dwTextSize[106] = 3; m_dwTextSize[107] = 6;
|
||
m_dwTextSize[108] = 3; m_dwTextSize[109] = 11; m_dwTextSize[110] = 7; m_dwTextSize[111] = 7;
|
||
m_dwTextSize[112] = 7; m_dwTextSize[113] = 7; m_dwTextSize[114] = 4; m_dwTextSize[115] = 7;
|
||
m_dwTextSize[116] = 3; m_dwTextSize[117] = 7; m_dwTextSize[118] = 6; m_dwTextSize[119] = 10;
|
||
m_dwTextSize[120] = 7; m_dwTextSize[121] = 7; m_dwTextSize[122] = 7; m_dwTextSize[123] = 6;
|
||
m_dwTextSize[124] = 6; m_dwTextSize[125] = 6; m_dwTextSize[126] = 9; m_dwTextSize[127] = 6;
|
||
m_dwTextSize[128] = 12;
|
||
|
||
HFONT hFont;
|
||
hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
|
||
GetObject(hFont, sizeof(LOGFONT), (void*)&m_LogFont);
|
||
strcpy(m_LogFont.lfFaceName, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||
D3DXCreateFontIndirect(BaseGraphicsLayer::GetDevice(), &m_LogFont, &m_lpText);
|
||
|
||
m_hEditBox = CreateWindow(TEXT("edit"), NULL, WS_CHILD | ES_LEFT | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
|
||
0, 0, 0, 0, hWnd, (HMENU)1, g_ClientMain.m_hInstance, NULL);
|
||
OldEditProc = (WNDPROC)SetWindowLong(m_hEditBox, GWL_WNDPROC, (long)EditProc);
|
||
}
|
||
|
||
void CGUITextEdit::SetEditLength(WPARAM wParam)
|
||
{
|
||
m_dwLimitLength = (unsigned long)wParam;
|
||
PostMessage(m_hEditBox, EM_LIMITTEXT, wParam, 0);
|
||
}
|
||
|
||
void CGUITextEdit::InitMessage(void)
|
||
{
|
||
m_lCarretPosition = 0;
|
||
strcpy(m_strMessage, "");
|
||
::SetWindowText(m_hEditBox, "");
|
||
HIMC hImc = ImmGetContext(m_hEditBox);
|
||
ImmSetCompositionString(hImc, SCS_SETSTR, "", 0, "", 0);
|
||
ImmReleaseContext(m_hEditBox, hImc);
|
||
}
|
||
|
||
void CGUITextEdit::AddNormalChatMessage(char *strMessage, unsigned long dwSender, unsigned long dwCommand)
|
||
{
|
||
bool bAdd = false;
|
||
int i;//, j;
|
||
unsigned long dwColor = GetChatColor(dwCommand);
|
||
|
||
if(dwSender != g_ClientMain.m_dwMyChrID)
|
||
{
|
||
CCreature *lpCreature = g_CharacterData.GetCreature(dwSender);
|
||
if(lpCreature)
|
||
{
|
||
strcpy(lpCreature->m_strChatMessage, strMessage);
|
||
lpCreature->m_fChatTimer = 8000.0f;
|
||
}
|
||
}
|
||
|
||
int len = strlen(strMessage), count = 0, countx = 0, start = 0;
|
||
for(i = 0; i < len; i++)
|
||
{
|
||
if(strMessage[i] & 0x80)
|
||
{
|
||
countx += m_dwTextSize[128];
|
||
count += 2;
|
||
i++;
|
||
if(countx >= 471) // 483 - 12 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqChatMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqChatMessage.begin());
|
||
m_deqChatMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqChatMessage.push_back(lpMessage);
|
||
|
||
if(m_deqChatMessage.size() > MAX_DRAWCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartChat = m_deqChatMessage.size() - MAX_DRAWCHAT;
|
||
}
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
} else
|
||
{
|
||
countx += m_dwTextSize[strMessage[i]];
|
||
count++;
|
||
if(countx >= 475) // 483 - 8 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqChatMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqChatMessage.begin());
|
||
m_deqChatMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqChatMessage.push_back(lpMessage);
|
||
|
||
if(m_deqChatMessage.size() > MAX_DRAWCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartChat = m_deqChatMessage.size() - MAX_DRAWCHAT;
|
||
}
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
}
|
||
}
|
||
if(start <= len)
|
||
{
|
||
if(m_deqChatMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqChatMessage.begin());
|
||
m_deqChatMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqChatMessage.push_back(lpMessage);
|
||
|
||
if(m_deqChatMessage.size() > MAX_DRAWCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartChat = m_deqChatMessage.size() - MAX_DRAWCHAT;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CGUITextEdit::AddPartyChatMessage(char *strMessage, unsigned long dwSender, unsigned long dwCommand)
|
||
{
|
||
int i, len = strlen(strMessage), count = 0, countx = 0, start = 0;
|
||
unsigned long dwColor = GetChatColor(dwCommand);
|
||
|
||
for(i = 0; i < len; i++)
|
||
{
|
||
if(strMessage[i] & 0x80)
|
||
{
|
||
countx += m_dwTextSize[128];
|
||
count += 2;
|
||
i++;
|
||
if(countx >= 471) // 483 - 12 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqPartyMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqPartyMessage.begin());
|
||
m_deqPartyMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqPartyMessage.push_back(lpMessage);
|
||
|
||
if(m_deqPartyMessage.size() > MAX_DRAWCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartParty = m_deqPartyMessage.size() - MAX_DRAWCHAT;
|
||
}
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
} else
|
||
{
|
||
countx += m_dwTextSize[strMessage[i]];
|
||
count++;
|
||
if(countx >= 475) // 483 - 8 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqPartyMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqPartyMessage.begin());
|
||
m_deqPartyMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqPartyMessage.push_back(lpMessage);
|
||
|
||
if(m_deqPartyMessage.size() > MAX_DRAWCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartParty = m_deqPartyMessage.size() - MAX_DRAWCHAT;
|
||
}
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
}
|
||
}
|
||
if(start <= len)
|
||
{
|
||
if(m_deqPartyMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqPartyMessage.begin());
|
||
m_deqPartyMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqPartyMessage.push_back(lpMessage);
|
||
|
||
if(m_deqPartyMessage.size() > MAX_DRAWCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartParty = m_deqPartyMessage.size() - MAX_DRAWCHAT;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CGUITextEdit::AddGuildChatMessage(char *strMessage, unsigned long dwSender, unsigned long dwCommand)
|
||
{
|
||
int i, len = strlen(strMessage), count = 0, countx = 0, start = 0;
|
||
unsigned long dwColor = GetChatColor(dwCommand);
|
||
|
||
for(i = 0; i < len; i++)
|
||
{
|
||
if(strMessage[i] & 0x80)
|
||
{
|
||
countx += m_dwTextSize[128];
|
||
count += 2;
|
||
i++;
|
||
if(countx >= 471) // 483 - 12 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqGuildMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqGuildMessage.begin());
|
||
m_deqGuildMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqGuildMessage.push_back(lpMessage);
|
||
|
||
if(m_deqGuildMessage.size() > MAX_DRAWCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartGuild = m_deqGuildMessage.size() - MAX_DRAWCHAT;
|
||
}
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
} else
|
||
{
|
||
countx += m_dwTextSize[strMessage[i]];
|
||
count++;
|
||
if(countx >= 475) // 483 - 8 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqGuildMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqGuildMessage.begin());
|
||
m_deqGuildMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqGuildMessage.push_back(lpMessage);
|
||
|
||
if(m_deqGuildMessage.size() > MAX_DRAWCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartGuild = m_deqGuildMessage.size() - MAX_DRAWCHAT;
|
||
}
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
}
|
||
}
|
||
if(start <= len)
|
||
{
|
||
if(m_deqGuildMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqGuildMessage.begin());
|
||
m_deqGuildMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqGuildMessage.push_back(lpMessage);
|
||
|
||
if(m_deqGuildMessage.size() > MAX_DRAWCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartGuild = m_deqGuildMessage.size() - MAX_DRAWCHAT;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CGUITextEdit::AddStallChatMessage(char *strMessage, unsigned long dwSender, unsigned long dwCommand)
|
||
{
|
||
bool bAdd = false;
|
||
int i;//, j;
|
||
unsigned long dwColor = GetChatColor(dwCommand);
|
||
|
||
int len = strlen(strMessage), count = 0, countx = 0, start = 0;
|
||
for(i = 0; i < len; i++)
|
||
{
|
||
if(strMessage[i] & 0x80)
|
||
{
|
||
countx += m_dwTextSize[128];
|
||
count += 2;
|
||
i++;
|
||
if(countx >= 179) // 191 - 12 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqStallMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqStallMessage.begin());
|
||
m_deqStallMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqStallMessage.push_back(lpMessage);
|
||
|
||
if(m_deqStallMessage.size() > MAX_DRAWSTALLCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartStall = m_deqStallMessage.size() - MAX_DRAWSTALLCHAT;
|
||
}
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
} else
|
||
{
|
||
countx += m_dwTextSize[strMessage[i]];
|
||
count++;
|
||
if(countx >= 179) // 191 - 8 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqStallMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqStallMessage.begin());
|
||
m_deqStallMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqStallMessage.push_back(lpMessage);
|
||
|
||
if(m_deqStallMessage.size() > MAX_DRAWSTALLCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartStall = m_deqStallMessage.size() - MAX_DRAWSTALLCHAT;
|
||
}
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
}
|
||
}
|
||
if(start <= len)
|
||
{
|
||
if(m_deqStallMessage.size() >= MAX_CHATMESSAGE)
|
||
{
|
||
delete (*m_deqStallMessage.begin());
|
||
m_deqStallMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = dwCommand;
|
||
lpMessage->fTimer = 8000.0f;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqStallMessage.push_back(lpMessage);
|
||
|
||
if(m_deqStallMessage.size() > MAX_DRAWSTALLCHAT)
|
||
{
|
||
// m_ScrollList[m_nChatScrollID].m_nNowPos = 79;
|
||
m_dwStartStall = m_deqStallMessage.size() - MAX_DRAWSTALLCHAT;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CGUITextEdit::DeleteStallMessage(void)
|
||
{
|
||
deque<Message *>::iterator it;
|
||
for(it = m_deqStallMessage.begin(); it != m_deqStallMessage.end(); it++)
|
||
{
|
||
delete (*it);
|
||
}
|
||
m_deqStallMessage.clear();
|
||
|
||
m_dwStartStall = 0;
|
||
}
|
||
|
||
void CGUITextEdit::AddMessage(char *strMessage, unsigned long dwSender, unsigned long dwCommand)
|
||
{
|
||
switch(m_dwChatMode)
|
||
{
|
||
case CHATMODE_CHAT:
|
||
AddNormalChatMessage(strMessage, dwSender, dwCommand);
|
||
break;
|
||
|
||
case CHATMODE_PARTY:
|
||
AddPartyChatMessage(strMessage, dwSender, dwCommand);
|
||
break;
|
||
|
||
case CHATMODE_GUILD:
|
||
AddGuildChatMessage(strMessage, dwSender, dwCommand);
|
||
break;
|
||
}
|
||
}
|
||
|
||
unsigned long CGUITextEdit::GetChatColor(unsigned long dwCommand)
|
||
{
|
||
switch(dwCommand)
|
||
{
|
||
case 1: // <20><>Ƽ ä<><C3A4>
|
||
return D3DCOLOR_RGBA(141, 180, 244, 255);
|
||
|
||
case 3:
|
||
return D3DCOLOR_RGBA(255, 0, 255, 255);
|
||
|
||
case 7: // <20><>ġ<EFBFBD><C4A1>
|
||
return D3DCOLOR_RGBA(53, 218, 193, 255);
|
||
|
||
case 10: // <20>ӼӸ<D3BC>
|
||
return D3DCOLOR_RGBA(255, 128, 239, 255);
|
||
|
||
case 128:
|
||
return D3DCOLOR_RGBA(100, 255, 100, 255);
|
||
|
||
case 129:
|
||
return D3DCOLOR_RGBA(255, 0, 0, 255);
|
||
|
||
case 130: // NPC <20><>ȭ
|
||
return D3DCOLOR_RGBA(252, 238, 92, 255);
|
||
|
||
case 131:
|
||
return D3DCOLOR_RGBA(255, 120, 0, 255);
|
||
|
||
default:
|
||
return D3DCOLOR_RGBA(255, 255, 255, 255);
|
||
}
|
||
}
|
||
|
||
void CGUITextEdit::AddNotice(char *strMessage, unsigned short wCmd)
|
||
{
|
||
int i, len = strlen(strMessage), count = 0, countx = 0, start = 0;
|
||
unsigned long dwColor;
|
||
|
||
switch(wCmd)
|
||
{
|
||
case 0:
|
||
dwColor = D3DCOLOR_RGBA(255, 0, 255, 255);
|
||
break;
|
||
|
||
case 1:
|
||
dwColor = D3DCOLOR_RGBA(135, 74, 173, 255);
|
||
break;
|
||
}
|
||
|
||
for(i = 0; i < len; i++)
|
||
{
|
||
if(strMessage[i] & 0x80)
|
||
{
|
||
countx += m_dwTextSize[128];
|
||
count += 2;
|
||
i++;
|
||
if(countx >= 471) // 483 - 12 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqNoticeMessage.size() >= 3)
|
||
{
|
||
delete (*m_deqNoticeMessage.begin());
|
||
m_deqNoticeMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = 255;
|
||
lpMessage->fTimer = 10000;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqNoticeMessage.push_back(lpMessage);
|
||
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
} else
|
||
{
|
||
countx += m_dwTextSize[strMessage[i]];
|
||
count++;
|
||
if(countx >= 475) // 483 - 8 <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ְ<EFBFBD> <20><>
|
||
{
|
||
if(m_deqNoticeMessage.size() >= 3)
|
||
{
|
||
delete (*m_deqNoticeMessage.begin());
|
||
m_deqNoticeMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = 255;
|
||
lpMessage->fTimer = 10000;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqNoticeMessage.push_back(lpMessage);
|
||
|
||
countx = count = 0;
|
||
start = i + 1;
|
||
}
|
||
}
|
||
}
|
||
|
||
if(start <= len)
|
||
{
|
||
if(m_deqNoticeMessage.size() >= 3)
|
||
{
|
||
delete (*m_deqNoticeMessage.begin());
|
||
m_deqNoticeMessage.pop_front();
|
||
}
|
||
|
||
Message *lpMessage;
|
||
lpMessage = new Message;
|
||
memcpy(lpMessage->strMessage, &strMessage[start], count);
|
||
lpMessage->strMessage[count] = '\0';
|
||
lpMessage->dwCommand = 255;
|
||
lpMessage->fTimer = 10000;
|
||
lpMessage->dwColor = dwColor;
|
||
m_deqNoticeMessage.push_back(lpMessage);
|
||
}
|
||
}
|
||
|
||
char *CGUITextEdit::MakePrintGold(unsigned long dwGold)
|
||
{
|
||
static char strGold[16];
|
||
char strTemp[16];
|
||
sprintf(strTemp, "%u", dwGold);
|
||
ZeroMemory(strGold, sizeof(strGold));
|
||
unsigned long dwLen = strlen(strTemp);
|
||
unsigned long dwTemp1 = dwLen / 3;
|
||
unsigned long dwTemp2 = dwLen % 3;
|
||
if(!dwTemp2 && dwTemp1) dwTemp1--;
|
||
unsigned long dwCount = 0, dwDotCount = 0;
|
||
for(unsigned long i = dwLen + dwTemp1; i > 0; i--)
|
||
{
|
||
dwDotCount++;
|
||
if((dwDotCount % 4) == 0)
|
||
{
|
||
dwDotCount = 0;
|
||
strGold[i - 1] = ',';
|
||
} else
|
||
{
|
||
strGold[i - 1] = strTemp[dwLen - dwCount - 1];
|
||
dwCount++;
|
||
}
|
||
}
|
||
|
||
return strGold;
|
||
}
|
||
|
||
char *CGUITextEdit::MakeWordBreak(const char *strString, unsigned long dwWidth)
|
||
{
|
||
static char strWordBreak[2048];
|
||
WCHAR strWideString[2048];
|
||
int nBufferSize = 2048;
|
||
int nWideStringLen;
|
||
unsigned long i;
|
||
|
||
MultiByteToWideChar(CP_ACP, 0, strString, strlen(strString) + 1, strWideString, nBufferSize);
|
||
nWideStringLen = wcslen(strWideString);
|
||
|
||
unsigned long dwStringWidth = 0;
|
||
// unsigned long dwStartPos = 0;
|
||
unsigned long dwSrcPos = 0;
|
||
unsigned long dwDstPos = 0;
|
||
|
||
WCHAR strWideBreak[256];
|
||
char strBreak[256];
|
||
|
||
strcpy(strWordBreak, "");
|
||
|
||
for(i = 0; i < nWideStringLen; i++)
|
||
{
|
||
if(strWideString[i] == 0x005c && strWideString[i + 1] == 0x005c)
|
||
{
|
||
ZeroMemory(strWideBreak, sizeof(strWideBreak));
|
||
wcsncpy(strWideBreak, &strWideString[dwSrcPos], i - dwSrcPos);
|
||
|
||
if(strWideString[i] < 128)
|
||
dwStringWidth = m_dwTextSize[strWideString[i]];
|
||
else
|
||
dwStringWidth = m_dwTextSize[128];
|
||
|
||
i += 2;
|
||
dwSrcPos = i;
|
||
WideCharToMultiByte(CP_ACP, 0, strWideBreak, wcslen(strWideBreak) + 1, strBreak, 256, NULL, NULL);
|
||
|
||
strcpy(&strWordBreak[dwDstPos], strBreak);
|
||
dwDstPos = strlen(strWordBreak);
|
||
strWordBreak[dwDstPos] = '\\'; dwDstPos++;
|
||
|
||
continue;
|
||
} else if(strWideString[i] < 128)
|
||
{
|
||
dwStringWidth += m_dwTextSize[strWideString[i]];
|
||
} else
|
||
{
|
||
dwStringWidth += m_dwTextSize[128];
|
||
}
|
||
|
||
if(dwStringWidth > dwWidth)
|
||
{
|
||
i--;
|
||
ZeroMemory(strWideBreak, sizeof(strWideBreak));
|
||
if(strWideString[i] == ' ')
|
||
{
|
||
i--;
|
||
wcsncpy(strWideBreak, &strWideString[dwSrcPos], i - dwSrcPos + 1);
|
||
i += 2;
|
||
|
||
if(strWideString[i] < 128)
|
||
dwStringWidth = m_dwTextSize[strWideString[i]];
|
||
else
|
||
dwStringWidth = m_dwTextSize[128];
|
||
} else
|
||
{
|
||
wcsncpy(strWideBreak, &strWideString[dwSrcPos], i - dwSrcPos + 1);
|
||
i++;
|
||
|
||
if(strWideString[i] < 128)
|
||
dwStringWidth = m_dwTextSize[strWideString[i]];
|
||
else
|
||
dwStringWidth = m_dwTextSize[128];
|
||
}
|
||
|
||
dwSrcPos = i;
|
||
WideCharToMultiByte(CP_ACP, 0, strWideBreak, wcslen(strWideBreak) + 1, strBreak, 256, NULL, NULL);
|
||
|
||
strcpy(&strWordBreak[dwDstPos], strBreak);
|
||
dwDstPos = strlen(strWordBreak);
|
||
strWordBreak[dwDstPos] = '\\'; dwDstPos++;
|
||
}
|
||
}
|
||
|
||
if(dwSrcPos < nWideStringLen)
|
||
{
|
||
ZeroMemory(strWideBreak, sizeof(strWideBreak));
|
||
if(strWideString[dwSrcPos] == ' ')
|
||
{
|
||
dwSrcPos++;
|
||
wcsncpy(strWideBreak, &strWideString[dwSrcPos], nWideStringLen - dwSrcPos + 1);
|
||
} else
|
||
{
|
||
wcsncpy(strWideBreak, &strWideString[dwSrcPos], nWideStringLen - dwSrcPos + 1);
|
||
}
|
||
|
||
WideCharToMultiByte(CP_ACP, 0, strWideBreak, wcslen(strWideBreak) + 1, strBreak, 256, NULL, NULL);
|
||
|
||
strcpy(&strWordBreak[dwDstPos], strBreak);
|
||
}
|
||
|
||
return strWordBreak;
|
||
}
|