📄 chat.cpp
字号:
// Chat.cpp: implementation of the CChat class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Chat.h"
#include "Hangul.h"
#include "menu.h"
#include "dragon.h"
#include "Hong_Sub.h"
#include "Map.h"
#include "CharDataTable.h"
#include "TeamBattle.h"
#include "GameProc.h"
#include "LineCommand.h"
#include "Tool.h"
#include "Hong_Sprite.h"
#include "directsound.h"
#include "SmallMenu.h"
#include "TextOutMgr.h"
#include "CurrentMsgMgr.h"
#include "QuestFunction.h" // 021128 kyo
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern int g_LocalWarBegin;
extern int GetNationIndex(int Nation);
CChatMgr ChatMgr;
void CChatMgr::AddString(const char* szName, const char* szChatData, const int iChatType)//盲泼 单捞鸥 眠啊
{
CChatData *InputData = new CChatData;
InputData->SetName(FONT_COLOR_NAME,szName);//捞抚悸泼
switch( iChatType )
{
case CHATTYPE_MERCHANT_BBS:
case CHATTYPE_NORMAL:
{//捞抚 悸泼篮 傍烹捞扼辑 困俊辑 等促
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iNormalCounter);
InputData->SetData(FONT_COLOR_WHITE,szChatData);
InputData->SetHeader(FONT_COLOR_WHITE,lan->OutputMessage(0,600));
}break;
case CHATTYPE_GUILD:
{
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iGuildCounter);
InputData->SetData(FONT_COLOR_RARE_MAIN,szChatData);
InputData->SetHeader(FONT_COLOR_RARE_MAIN,lan->OutputMessage(0,601));// "辨靛");
}break;//庇富篮 捞力何磐苛祸
case CHATTYPE_COLOSSUS_GLOBAL:
{
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iColosussCounter);
InputData->SetData(FONT_COLOR_BLIGHT_VIOLET,szChatData);
InputData->SetHeader(FONT_COLOR_BLIGHT_VIOLET,lan->OutputMessage(0,602));//"酒饭唱1"
}break;
case CHATTYPE_COLOSSUS :
{
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iColosussCounter);
InputData->SetData(FONT_COLOR_BLIGHT_VIOLET,szChatData);
InputData->SetHeader(FONT_COLOR_BLIGHT_VIOLET,lan->OutputMessage(0,603));//"酒饭唱2"
}break;
case CHATTYPE_WHISPER:
{
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iWhisperCounter);
InputData->SetData(FONT_COLOR_GREEN,szChatData);
InputData->SetHeader(FONT_COLOR_GREEN,lan->OutputMessage(0,604));//"庇富"
}break;//庇富篮 捞力何磐苛祸
case CHATTYPE_LOCAL_WAR :
{
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iLocalWarCounter);
InputData->SetData(FONT_COLOR_BLIGHT_ORANGE,szChatData);
InputData->SetHeader(FONT_COLOR_BLIGHT_ORANGE,lan->OutputMessage(0,605));//"惫瘤傈"
}break;
case CHATTYPE_NATION_WAR :
{
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iNationWarCounter);
InputData->SetData(FONT_COLOR_BLIGHT_ORANGE,szChatData);
InputData->SetHeader(FONT_COLOR_BLIGHT_ORANGE,lan->OutputMessage(0,606));//"惫啊傈"
}break;
case CHATTYPE_PARTY:
{
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iPartyCounter);
InputData->SetData(FONT_COLOR_BORA,szChatData);
InputData->SetHeader(FONT_COLOR_BORA,lan->OutputMessage(0,607));//"颇萍"
}break;
case CHATTYPE_GUILD_BBS:
{
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iGuildBBSCounter);
InputData->SetData(FONT_COLOR_RARE_MAIN,szChatData);
InputData->SetHeader(FONT_COLOR_RARE_MAIN,lan->OutputMessage(0,608));//"辨靛傍瘤"
}break;
case CHATTYPE_YES_OR_NO:
{
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iYesNoCounter);
InputData->SetData(FONT_COLOR_BLIGHT_BLUE,szChatData);
InputData->SetHeader(FONT_COLOR_RED,lan->OutputMessage(0,611));//"匙/酒聪坷"
}break;
case CHATTYPE_NOTICE:
{
// ::AddCurrentStatusMessage( 200,200,0,lan->OutputMessage(3,131) );//010215 lsw
// ::AddCurrentStatusMessage( 255,255,0, szChatData );
InputData->SetChatType(iChatType,++m_iTotalCounter,++m_iYesNoCounter);
InputData->SetData(FONT_COLOR_SOLID_YELLOW,szChatData);
InputData->SetHeader(FONT_COLOR_SOLID_YELLOW,lan->OutputMessage(0,612));//"傍瘤荤亲"
}break;
default:
{
InputData->SetChatType(iChatType,++m_iTotalCounter,m_iTotalCounter);
InputData->SetData(FONT_COLOR_WHITE,szChatData);
InputData->SetHeader(FONT_COLOR_WHITE,"");
}break;
}
InputData->MakeTotalData();
ChatList.push_back(InputData);//
int iCount =0;
for( chatitor itor = ChatList.end() ; itor != ChatList.begin();)
{
itor--;
if( !(*itor)->IsDisplayAble() ){continue;}
const int iResult = GetRectTextLine((*itor)->GetTotalData(),m_iWidth);//窜鉴洒 扼牢荐 技绰 何盒
iCount += iResult;//捞 临阑 框流捞瘤 付技夸 亲惑 弥 窍窜
if(iCount > MAX_CHAT_COUNT )
{
(*itor)->SetDisplayAble(false);
}
}
}
void CChatMgr::DisplayPastData(const int iType)
{
for( chatitor itor = ChatList.begin() ; itor != ChatList.end();itor++)
{ //历厘 登绢 乐绊 泅犁 拳搁俊 救唱坷绰巴
if( iType == (*itor)->GetChatType() && !(*itor)->IsDisplayAble() )
{
((*itor)->IsHaveHeader())?
AddCurrentStatusMessage((*itor)->GetHeaderColor(),"[%s] %s: %s",(*itor)->GetHeader(),(*itor)->GetName(),(*itor)->GetData())
:AddCurrentStatusMessage((*itor)->GetHeaderColor(),"%s: %s",(*itor)->GetName(),(*itor)->GetData());
}
}
}
void CChatMgr::DeleteCheck()//iIndex2俊 蝶扼 阿阿狼 历厘 肮荐啊 逞栏搁
{
for( chatitor itor = ChatList.begin() ; itor != ChatList.end();)
{
int iCompareCount = 0;//扁废 巢败具 且 矫累痢
switch((*itor)->GetChatType())
{
case CHATTYPE_NORMAL: {iCompareCount = m_iNormalCounter - MAX_NORMAL_COUNT; }break;
case CHATTYPE_GUILD: {iCompareCount = m_iGuildCounter - MAX_GUILD_COUNT; }break;
case CHATTYPE_COLOSSUS_GLOBAL:
case CHATTYPE_COLOSSUS : {iCompareCount = m_iColosussCounter - MAX_COLOSUSS_COUNT; }break;
case CHATTYPE_WHISPER: {iCompareCount = m_iWhisperCounter - MAX_WHISPER_COUNT; }break;
case CHATTYPE_LOCAL_WAR: {iCompareCount = m_iLocalWarCounter - MAX_LOCALWAR_COUNT; }break;
case CHATTYPE_NATION_WAR: {iCompareCount = m_iNationWarCounter- MAX_NATIONWAR_COUNT; }break;
case CHATTYPE_PARTY: {iCompareCount = m_iPartyCounter - MAX_PARTY_COUNT; }break;
case CHATTYPE_GUILD_BBS: {iCompareCount = m_iGuildBBSCounter - MAX_GUILDBBS_COUNT; }break;
case CHATTYPE_YES_OR_NO: {iCompareCount = m_iYesNoCounter - MAX_YES_NO_COUNT; }break;
case CHATTYPE_NOTICE: {iCompareCount = m_iNoticeCounter - MAX_NOTICE_COUNT; }break;
default:{iCompareCount= 0;}break;//公炼扒 瘤况 廉扼
}
const int iMyCount = (*itor)->GetIndex2();
if( iMyCount < iCompareCount)//历厘瞪 Max肮荐甫 逞绢艾栏搁 瘤款促
{
SAFE_DELETE((*itor));
itor = ChatList.erase(itor);
}
else
{
itor++;
}
}
}
void CChatMgr::DisplayCheck()//傈眉 牢郸胶甫 眉农秦辑 9临 逞阑芭 鞍栏搁 DisplayAble阑 false肺 秦 霖促
{//DeleteCheck() 咯扁辑 磊悼栏肺 瘤快扁甫 茄促,
const DWORD dwNowTime = ::timeGetTime();
int iCount = 0;
for( chatitor itor = ChatList.begin() ; itor != ChatList.end();itor++)
{
if( !(*itor)->IsDisplayAble() ){continue;}
const DWORD dwMaxDisplayTime = (*itor)->GetMaxDisplayTime();
const int iDisplayAbleCounter = GetDisplayAbleCounter();
if ( (dwNowTime > dwMaxDisplayTime) //叼胶敲饭捞 矫埃 坷滚捞芭唱
// || ( (*itor)->GetIndex() <= iDisplayAbleCounter) //拳搁 免仿 秦具 窍绰单 墨款磐啊 葛磊扼搁
)
{
(*itor)->SetDisplayAble(false);
}
}
if( m_dwSelectWaitTime && dwNowTime > m_dwSelectWaitTime)
{//矫埃 檬苞
ClearYesNo();//努府绢~
}
}
int CChatMgr::DrawChatData(CChatData* pData,const int iLineCount,const int iX, const int iY)//臂磊 嘛绰 何盒阑 毒巴涝聪促.//嘛篮 临 荐甫 府畔钦聪促.
{//鉴荐 免仿 窃荐.
const int iTextX = iX+2;
const int iTextY = iY+2;
const int iResult = GetRectTextLine(pData->GetTotalData(),m_iWidth);//窜鉴洒 扼牢荐 技绰 何盒
for(int iCt = 0 ; iCt < iResult;iCt++)
{
FieldTypeNomalPutFx3( iX, iY+(iLineCount+iCt)*m_iLineGab, 0,0, 11, NEW_CHAT_BACK_IMG, m_iAlpha, m_iBlendType );//捞芭 绢痘霸 嘛衬 ぱぱ;
}
Hcolor(pData->GetDataColor());//021030 lsw
TxtOut.RcTXTOutBNoBG(iTextX, iTextY+iLineCount*m_iLineGab, m_iWidth, 0,"%s",pData->GetTotalData());//祸彬喊肺 嘛绰 何盒 傈眉
if(pData->IsHaveHeader())
{
Hcolor(pData->GetNameColor());
TxtOut.RcTXTOutBNoBG(iTextX, iTextY+iLineCount*m_iLineGab, m_iWidth, 0,"%s %s",pData->GetHeader(),pData->GetName());//祸彬喊肺 嘛绰 何盒 傈眉
Hcolor(pData->GetHeaderColor());
TxtOut.RcTXTOutBNoBG(iTextX, iTextY+iLineCount*m_iLineGab, m_iWidth, 0,"%s",pData->GetHeader());//祸彬喊肺 嘛绰 何盒 傈眉
}
else
{
Hcolor(pData->GetNameColor());
TxtOut.RcTXTOutBNoBG(iTextX, iTextY+iLineCount*m_iLineGab, m_iWidth, 0,"%s",pData->GetName());//祸彬喊肺 嘛绰 何盒 傈眉
}
return iResult;
}
void CChatMgr::DisplayData( const int iX, const int iY ,const int iOption)
{
DisplayCheck();//瘤陛 免仿 瞪 荐乐绰 局甸 眉农//矫埃捞唱 扼牢 箭磊甫 技绢 杭荐 乐绊 绝澜阑 搬沥.
DeleteCheck();//瘤况廉具且 局甸 眉农
int iNormalGroupCount = 0;
int iGuildGroupCount = 0;
int iWhisperGroupCount = 0;
int iNoticeGroupCount = 0;
//畴富, 辨靛, 庇富 3俺促 ON 捞搁 4 4 2 厚啦
//畴富, 辨靛 --> 5 5 厚啦
//畴富, 庇富 --> 7,3 厚啦
//辨靛, 庇富 --> 7,3 厚啦
{//扼牢荐 惶扁 //免仿 傈囚 绝澜
int iLineCount = MAX_CHAT_COUNT;
// 1. 畴富弊缝, 辨靛弊缝, 庇富弊缝 泅犁 嘛鳃荐乐绰 单捞鸥狼 扼牢荐甫 惶绰促.
// 2. 庇富弊缝, 辨靛弊缝, 畴富弊缝 鉴栏肺 酒贰俊辑 何磐 嘛绰促.
// 3. 庇富 嘛阑锭 困俊 辨靛尔 畴富 墨款飘 歹窍扁 秦焊绊 嘛档废 茄促.
for( rchatitor itor = ChatList.rbegin(); itor != ChatList.rend();itor++)//庇富弊缝 嘛扁
{
if(!(*itor)->IsDisplayAble()){continue;}//叼胶敲饭捞 啊瓷茄 局甸父 焊咯 霖促
const int iChatType = (*itor)->GetChatType();
if(!IsDisplayAbleType(iChatType)){continue; }
const int iResult = GetRectTextLine((*itor)->GetTotalData(),m_iWidth);//窜鉴洒 扼牢荐 技绰 何盒
switch(iChatType)
{
case CHATTYPE_NORMAL :
case CHATTYPE_COLOSSUS_GLOBAL :
case CHATTYPE_COLOSSUS :
case CHATTYPE_LOCAL_WAR :
case CHATTYPE_NATION_WAR :
{
iNormalGroupCount += iResult;
}break;
case CHATTYPE_WHISPER :
case CHATTYPE_PARTY :
{
iWhisperGroupCount += iResult;
}break;
case CHATTYPE_GUILD :
case CHATTYPE_GUILD_BBS ://辨靛 傍瘤绰 公炼扒 甸绢柯促
{
iGuildGroupCount += iResult;
}break;
case CHATTYPE_YES_OR_NO :
case CHATTYPE_NOTICE :
{
iNoticeGroupCount += iResult;
}break;
default:{}break;
}
}
}
int iLineCount = MAX_CHAT_COUNT;//酒贰俊辑 何磐 嘛扁 锭巩俊
{
for( rchatitor itor = ChatList.rbegin(); itor != ChatList.rend();itor++)//傍瘤 嘛扁
{
if(!(*itor)->IsDisplayAble()){continue;}//叼胶敲饭捞 啊瓷茄 局甸父 焊咯 霖促
const int iChatType = (*itor)->GetChatType();
if(!IsDisplayAbleType(iChatType)){continue;}
const int iResult = GetRectTextLine((*itor)->GetTotalData(),m_iWidth);//窜鉴洒 扼牢荐 技绰 何盒
switch(iChatType)
{
case CHATTYPE_YES_OR_NO:
{
if(!IsCheckYesNoAble())//瘤陛 YesNo 酒囱 惑怕搁 免仿摹 臼澜
{
continue;
}
}
case CHATTYPE_NOTICE:
{
const int iCutLineCount = 5;//5临 促 嘛绰 荐啊 乐促
const int iOtherLineCount = MAX_CHAT_COUNT-iCutLineCount;
if( iCutLineCount < MAX_CHAT_COUNT - iLineCount )//目飘扼牢 鳖瘤 嘛绊
{
if(iOtherLineCount <= iNormalGroupCount+iGuildGroupCount)
{//巢篮 弊副 荐 乐绰 沫阑 逞绢急促搁
continue;
}
else
{
break;//沫阑 逞绢辑瘤父 臼栏搁 弊成 歹 弊赴促.
}
}
}break;
default:{continue;}break;
}
iLineCount -= iResult;
DrawChatData((*itor),iLineCount,iX,iY);//捞 临阑 框流捞瘤 付技夸 亲惑 弥窍窜 官肺困
if( 0 > iLineCount ){break;}//扼牢 场唱搁 胶砰.//弥窍窜
}
}
{
for( rchatitor itor = ChatList.rbegin(); itor != ChatList.rend();itor++)//庇富弊缝 嘛扁
{
if(!(*itor)->IsDisplayAble()){continue;}//叼胶敲饭捞 啊瓷茄 局甸父 焊咯 霖促
const int iChatType = (*itor)->GetChatType();
if(!IsDisplayAbleType(iChatType)){continue;}
const int iResult = GetRectTextLine((*itor)->GetTotalData(),m_iWidth);//窜鉴洒 扼牢荐 技绰 何盒
switch(iChatType)
{
case CHATTYPE_WHISPER :
case CHATTYPE_PARTY :
{
const int iCutLineCount = (m_iNormalChatView&&m_iGuildChatView)?2:3;//辨靛 畴富 笛促 难廉 乐栏搁 2临, 酒聪搁 3临
const int iOtherLineCount = MAX_CHAT_COUNT-iCutLineCount;
if( iCutLineCount < MAX_CHAT_COUNT - iLineCount )//目飘扼牢 鳖瘤 嘛绊
{
if(iOtherLineCount <= iNormalGroupCount+iGuildGroupCount)
{//巢篮 弊副 荐 乐绰 沫阑 逞绢急促搁
continue;
}
else
{
break;//沫阑 逞绢辑瘤父 臼栏搁 弊成 歹 弊赴促.
}
}
}break;
default:{continue;}break;
}
iLineCount -= iResult;
DrawChatData((*itor),iLineCount,iX,iY);//捞 临阑 框流捞瘤 付技夸 亲惑 弥窍窜 官肺困
if( 0 > iLineCount ){break;}//扼牢 场唱搁 胶砰.//弥窍窜
}
}
{
for( rchatitor itor = ChatList.rbegin(); itor != ChatList.rend();itor++)//辨靛弊缝 嘛扁
{
if(!(*itor)->IsDisplayAble()){continue;}//叼胶敲饭捞 啊瓷茄 局甸父 焊咯 霖促
const int iChatType = (*itor)->GetChatType();
if(!IsDisplayAbleType(iChatType)){continue;}
const int iResult = GetRectTextLine((*itor)->GetTotalData(),m_iWidth);//窜鉴洒 扼牢荐 技绰 何盒
switch(iChatType)
{
case CHATTYPE_GUILD:
case CHATTYPE_GUILD_BBS:
{//畴富 父 波瘤搁 7临, 庇富父 波瘤搁 5临.
int iCutLineCount =0;
if(m_iNormalChatView && !m_iWhisperChatView)
{//畴富苞 辨靛啊 难廉乐促.
iCutLineCount = 5;
}
if(!m_iNormalChatView && m_iWhisperChatView)
{//辨靛客 庇富捞 难廉乐促.
iCutLineCount = 7;
}
if(m_iNormalChatView && m_iWhisperChatView)
{//傈何促 难廉乐促.
iCutLineCount = 4;
}//畴富苞 辨靛 波柳扒 惑包 富磊 continue啊 乐栏聪鳖.
const int iOtherLineCount = MAX_CHAT_COUNT-iCutLineCount;
if( iCutLineCount < MAX_CHAT_COUNT - iLineCount )//目飘扼牢 鳖瘤 嘛绊
{
if(iOtherLineCount <= iNormalGroupCount+iWhisperGroupCount)
{//巢篮 弊副 荐 乐绰 沫阑 逞绢急促搁
continue;
}
else
{
break;//沫阑 逞绢辑瘤父 臼栏搁 弊成 歹 弊赴促.
}
}
}break;
default:{continue;}break;
}
iLineCount -=iResult;
DrawChatData((*itor),iLineCount,iX,iY);//捞 临阑 框流捞瘤 付技夸 亲惑 弥窍窜 官肺困
if(0 > iLineCount ){break;}//扼牢 场唱搁 胶砰.//弥窍窜
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -