Files
Client/Server/ToolProject/GameLogAnalyzer/LogAnalyzer.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
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>
2025-11-29 20:17:20 +09:00

661 lines
21 KiB
C++

#include "stdafx.h"
#include <algorithm>
#include "PrintLog.h"
#include "SearchClass.h"
#include "LogAnalyzer.h"
#include <RylGameLibrary/Log/LogCommands.h>
#include "GlobalFunctions.h"
#include "XListBox.h"
#include "CheckComboBox.h"
#include <GameGuardLib/ggsrv.h>
// edith 2009.08.11 °ÔŔÓ°Ąľĺ 2.5 ž÷ą×ˇšŔĚľĺ
GGAUTHS_API void NpLog(int mode, char* msg)
{
}
GGAUTHS_API void GGAuthUpdateCallback(PGG_UPREPORT report)
{
}
struct CategoryInfo
{
typedef void PrintSimpleInfo(CString& Result, const GAMELOG::sLogBase* lpLogBase);
const char* m_szCategoryName;
unsigned char m_cCmd;
CXListBox::Color m_nFGColor;
CXListBox::Color m_nBGColor;
PrintSimpleInfo* m_lpSimpleInfo;
CategoryInfo() : m_szCategoryName(0), m_cCmd(0),
m_nFGColor(CXListBox::Black), m_nBGColor(CXListBox::White), m_lpSimpleInfo(0)
{
}
CategoryInfo(const char* szCategoryName, unsigned char cCmd,
CXListBox::Color nFGColor, CXListBox::Color nBGColor, PrintSimpleInfo* lpSimpleInfo)
: m_szCategoryName(szCategoryName), m_cCmd(cCmd),
m_nFGColor(nFGColor), m_nBGColor(nBGColor), m_lpSimpleInfo(lpSimpleInfo)
{
}
};
class CCategoryData
{
public:
CCategoryData();
static CCategoryData& GetInstance();
CategoryInfo* GetCategoryInfo(unsigned char cCmd)
{
return cCmd < GAMELOG::CMD::MAX_LOGCMD ? m_categoryInfo + cCmd : 0;
}
CategoryInfo* GetCategoryInfo(const char* szText)
{
CategoryInfo* lpPos = m_categoryInfo;
CategoryInfo* lpEnd = m_categoryInfo + GAMELOG::CMD::MAX_LOGCMD;
for(; lpPos != lpEnd; ++lpPos)
{
if(0 != lpPos->m_szCategoryName &&
0 == strcmp(lpPos->m_szCategoryName, szText))
{
return lpPos;
}
}
return 0;
}
private:
CategoryInfo m_categoryInfo[GAMELOG::CMD::MAX_LOGCMD];
};
CCategoryData& CCategoryData::GetInstance()
{
static CCategoryData categoryData;
return categoryData;
}
namespace GAMELOG
{
namespace CMD
{
const unsigned int ALL = 0;
};
};
CCategoryData::CCategoryData()
{
using namespace GAMELOG::SimpleInfo;
#define SET_CATEGORY_DATA(name, fgColor, bgColor, lpSimpleInfo) \
m_categoryInfo[GAMELOG::CMD::name] = \
CategoryInfo(#name, GAMELOG::CMD::name, fgColor, bgColor, lpSimpleInfo);
SET_CATEGORY_DATA(ALL, CXListBox::Black, CXListBox::White, 0);
SET_CATEGORY_DATA(CHAR_LOGIN, CXListBox::Yellow, CXListBox::Black, CharLogin);
SET_CATEGORY_DATA(CHAR_LOGOUT, CXListBox::Yellow, CXListBox::Black, CharLogout);
SET_CATEGORY_DATA(CHAR_CREATE, CXListBox::Black, CXListBox::White, CharCreate);
SET_CATEGORY_DATA(CHAR_DELETE, CXListBox::Black, CXListBox::WhitePink, CharDelete);
SET_CATEGORY_DATA(CHAR_DBUPDATE, CXListBox::Black, CXListBox::White, CharDBUpdate);
SET_CATEGORY_DATA(CHAR_LEVELUP, CXListBox::Black, CXListBox::White, CharLevelUp);
SET_CATEGORY_DATA(CHAR_BIND_POS, CXListBox::Black, CXListBox::White, CharBindPos);
SET_CATEGORY_DATA(CHAR_DEAD, CXListBox::Black, CXListBox::WhitePink, CharDead);
SET_CATEGORY_DATA(CHAR_RESPAWN, CXListBox::Black, CXListBox::White, CharRespawn);
SET_CATEGORY_DATA(MOVE_ITEM, CXListBox::Black, CXListBox::White, MoveItem);
SET_CATEGORY_DATA(SWAP_ITEM, CXListBox::Black, CXListBox::White, SwapItem);
SET_CATEGORY_DATA(USE_ITEM, CXListBox::Black, CXListBox::White, UseItem);
SET_CATEGORY_DATA(SPLIT_ITEM, CXListBox::Black, CXListBox::White, SplitItem);
SET_CATEGORY_DATA(PICKUP_ITEM, CXListBox::Black, CXListBox::White, PickupItem);
SET_CATEGORY_DATA(DROP_ITEM, CXListBox::Black, CXListBox::White, DropItem);
SET_CATEGORY_DATA(BUY_ITEM, CXListBox::Black, CXListBox::White, BuyItem);
SET_CATEGORY_DATA(SELL_ITEM, CXListBox::Black, CXListBox::White, SellItem);
SET_CATEGORY_DATA(USE_LOTTERY, CXListBox::Black, CXListBox::White, UseLottery);
SET_CATEGORY_DATA(BEFORE_EXCHANGE_ITEM, CXListBox::Black, CXListBox::Yellow, BeforeExchange);
SET_CATEGORY_DATA(AFTER_EXCHANGE_ITEM, CXListBox::Black, CXListBox::Yellow, AfterExchange);
SET_CATEGORY_DATA(INSTALL_SOCKET_ITEM, CXListBox::Black, CXListBox::White, InstallSocketItem);
SET_CATEGORY_DATA(REPAIR_ITEM, CXListBox::Black, CXListBox::White, RepairItem);
SET_CATEGORY_DATA(CHANGE_WEAPON, CXListBox::Black, CXListBox::White, ChangeWeapon);
SET_CATEGORY_DATA(TAKE_GOLD, CXListBox::Black, CXListBox::White, TakeGold);
SET_CATEGORY_DATA(UPGRADE_ITEM, CXListBox::Black, CXListBox::White, UpgradeItem);
SET_CATEGORY_DATA(STALL_OPEN_CLOSE, CXListBox::Black, CXListBox::White, StallOpenClose);
SET_CATEGORY_DATA(STALL_ENTER_LEAVE, CXListBox::Black, CXListBox::White, StallEnterLeave);
SET_CATEGORY_DATA(STALL_ITEM_REGISTER_REMOVE, CXListBox::Black, CXListBox::White, StallRegisterRemoveItem);
SET_CATEGORY_DATA(MEDAL_BUY_ITEM, CXListBox::Black, CXListBox::White, MedalItemBuy);
SET_CATEGORY_DATA(TAKE_GOLD_V2, CXListBox::Black, CXListBox::White, TakeGoldV2);
SET_CATEGORY_DATA(GUILD_CREATE, CXListBox::Black, CXListBox::White, GuildCreate);
SET_CATEGORY_DATA(GUILD_JOIN, CXListBox::Black, CXListBox::White, GuildJoin);
SET_CATEGORY_DATA(GUILD_MEMBER_LEVEL, CXListBox::Black, CXListBox::White, GuildMemberLevelAdjust);
SET_CATEGORY_DATA(GUILD_LEAVE, CXListBox::Black, CXListBox::White, GuildLeave);
SET_CATEGORY_DATA(GUILD_RIGHTS_CHANGE, CXListBox::Black, CXListBox::White, GuildRightsLevelChange);
SET_CATEGORY_DATA(GUILD_LEVEL_ADJUST, CXListBox::Black, CXListBox::White, GuildLevelChange);
SET_CATEGORY_DATA(GUILD_MARK_ADJUST, CXListBox::Black, CXListBox::White, GuildMarkChange);
SET_CATEGORY_DATA(GUILD_GOLD_CHANGE, CXListBox::Black, CXListBox::Yellow, GuildStoreGoldChange);
SET_CATEGORY_DATA(GUILD_DISSOLVE, CXListBox::Black, CXListBox::White, GuildDispose);
SET_CATEGORY_DATA(ZONE_MOVE, CXListBox::Black, CXListBox::White, ZoneMoveLog);
SET_CATEGORY_DATA(ITEM_ATTACH_OPTION, CXListBox::Black, CXListBox::White, ItemAttachOption);
SET_CATEGORY_DATA(ITEM_COMPENSATION, CXListBox::Black, CXListBox::SkyBlue, ItemCompensation);
SET_CATEGORY_DATA(TICKET_BUY_SKILLBOOK, CXListBox::Black, CXListBox::White, TicketBuySkillBook);
SET_CATEGORY_DATA(UPGRADE_ITEM_V2, CXListBox::Black, CXListBox::White, UpgradeItemV2);
SET_CATEGORY_DATA(MONSTER_DEAD, CXListBox::Black, CXListBox::White, MonsterDead);
SET_CATEGORY_DATA(FAME_GET_BATTLE, CXListBox::Black, CXListBox::White, FameGetBattle);
SET_CATEGORY_DATA(FAME_LOSE_BATTLE, CXListBox::Black, CXListBox::White, FameLoseBattle);
SET_CATEGORY_DATA(FAME_GET_CAMP, CXListBox::Black, CXListBox::White, FameGetCamp);
SET_CATEGORY_DATA(FAME_LOSE_CAMP, CXListBox::Black, CXListBox::White, FameLoseCamp);
SET_CATEGORY_DATA(QUEST_GET_REWARD, CXListBox::Black, CXListBox::White, QuestGetReward);
SET_CATEGORY_DATA(CHANGE_RIDE, CXListBox::Black, CXListBox::White, ChangeRide);
SET_CATEGORY_DATA(ILLEGAL_ITEM, CXListBox::White, CXListBox::Red, IllegalItem);
SET_CATEGORY_DATA(ILLEGAL_WARPPOS, CXListBox::White, CXListBox::Red, IllegalWarpPos);
SET_CATEGORY_DATA(HACK_DOUBT, CXListBox::White, CXListBox::Red, HackDoubt);
};
CLogAnalyzer::CLogAnalyzer()
: m_nCurrentIndex(0), m_dwShowMode(0)
{
m_ResultArray.reserve(5120);
memset(m_szFileName, 0, MAX_PATH);
}
CLogAnalyzer::~CLogAnalyzer()
{
Cleanup();
}
bool CLogAnalyzer::Initialize(HWND hWnd_In, CComboBox& SearchSort_Out, CCheckComboBox& Category_Out)
{
if(CB_ERR == SearchSort_Out.InsertString(0, "CID")) { return false; }
if(CB_ERR == SearchSort_Out.InsertString(1, "UID")) { return false; }
if(CB_ERR == SearchSort_Out.InsertString(2, "ItemUID")) { return false; }
if(CB_ERR == SearchSort_Out.InsertString(3, "IP")) { return false; }
if(CB_ERR == SearchSort_Out.InsertString(4, "ItemTypeID")) { return false; }
if(CB_ERR == SearchSort_Out.InsertString(5, "GID")) { return false; }
if(CB_ERR == SearchSort_Out.SetCurSel(0)) { return false; }
unsigned char nCount = 0;
unsigned char nStringNum = 0;
for(; nCount < GAMELOG::CMD::MAX_LOGCMD; ++nCount)
{
CategoryInfo* lpInfo = CCategoryData::GetInstance().GetCategoryInfo(nCount);
if(0 != lpInfo && 0 != lpInfo->m_szCategoryName)
{
if(CB_ERR == Category_Out.InsertString(nStringNum, lpInfo->m_szCategoryName))
{
return false;
}
Category_Out.SetItemData(nStringNum, nCount);
++nStringNum;
}
}
if(CB_ERR == Category_Out.SetCurSel(0)) { return false; }
memset(&m_OpenFile, 0, sizeof(OPENFILENAME));
m_OpenFile.lStructSize = sizeof(OPENFILENAME);
m_OpenFile.hwndOwner = hWnd_In;
m_OpenFile.lpstrFilter = "Log and ziped files\0*.zip;*.log\0All files\0*.*";
m_OpenFile.nMaxFile = MAX_PATH * MAX_PATH;
m_OpenFile.Flags = OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_EXPLORER;
m_OpenFile.lpstrFile = m_szFileName;
return true;
}
bool CLogAnalyzer::Cleanup()
{
m_nCurrentIndex = 0;
m_ResultArray.clear();
return true;
}
bool CLogAnalyzer::Open()
{
Cleanup();
ZeroMemory(m_szFileName, MAX_PATH);
//if(!GetOpenFileName(&m_OpenFile))
//{
// return false;
//}
if (GetOpenFileName(&m_OpenFile))
return m_ParseLog.LoadFile(m_szFileName);
return true;
}
bool CLogAnalyzer::Search(CCheckComboBox& categoryValue_In,
const CString& SearchType_In, const CString& SearchValue_In,
const CTime& StartTime, const CTime& StopTime,
const CRegion& Region, const BOOL bSearchInResult)
{
m_nCurrentIndex = 0;
return Search(m_ParseLog, m_ResultArray, categoryValue_In,
SearchType_In, SearchValue_In, StartTime, StopTime, Region, bSearchInResult);
}
bool CLogAnalyzer::Search(CParseLog& ParseLog,
CParseLog::LogPtrArray& ResultArray,
CCheckComboBox& categoryValue_In,
const CString& SearchType_In, const CString& SearchValue_In,
const CTime& StartTime, const CTime& StopTime,
const CRegion& Region, const BOOL bSearchInResult)
{
CParseLog::LogPtrArray Result;
// ˝Ă°Ł´ë °Ëťö
if(bSearchInResult)
{
CParseLog::Find(ResultArray, Result, CTimeSearch(StartTime, StopTime));
ResultArray.swap(Result);
}
else
{
ParseLog.Find(ResultArray, CTimeSearch(StartTime, StopTime));
}
// ÇŕľżšÝ°ć °Ëťö
if(Region.IsValid())
{
CParseLog::Find(ResultArray, Result, CPositionSearch(Region));
ResultArray.swap(Result);
}
// CID, UID, ItemUID, ItemTypeID ˇÎ °Ëťö
if(0 == SearchType_In.Compare("CID"))
{
CParseLog::Find(ResultArray, Result, CCIDSearch(SearchValue_In));
ResultArray.swap(Result);
}
else if(0 == SearchType_In.Compare("UID"))
{
CParseLog::Find(ResultArray, Result, CUIDSearch(SearchValue_In));
ResultArray.swap(Result);
}
else if(0 == SearchType_In.Compare("ItemUID"))
{
CParseLog::Find(ResultArray, Result, CItemUIDSearch(SearchValue_In));
ResultArray.swap(Result);
}
else if(0 == SearchType_In.Compare("IP"))
{
CParseLog::Find(ResultArray, Result, CIPSearch(SearchValue_In));
ResultArray.swap(Result);
}
else if(0 == SearchType_In.Compare("ItemTypeID"))
{
CParseLog::Find(ResultArray, Result, CItemTypeIDSearch(SearchValue_In));
ResultArray.swap(Result);
}
else if(0 == SearchType_In.Compare("GID"))
{
CParseLog::Find(ResultArray, Result, CGIDSearch(SearchValue_In));
ResultArray.swap(Result);
}
// ALLŔĚ ĂźĹŠľÇžî ŔÖÁö žĘŔ¸¸é Ŕç°Ëťö.
int nCount = categoryValue_In.FindString(0, "ALL");
if(CB_ERR != nCount)
{
if(!categoryValue_In.GetCheck(nCount))
{
CString strText;
CCategory::CMDArray CMDArray;
for(int nIndex = 0; nIndex < categoryValue_In.GetCount(); ++nIndex)
{
if (categoryValue_In.GetCheck(nIndex))
{
categoryValue_In.GetLBText(nIndex, strText);
if(!strText.IsEmpty())
{
CategoryInfo* lpCategoryInfo =
CCategoryData::GetInstance().GetCategoryInfo(strText);
if(lpCategoryInfo)
{
CMDArray.push_back(lpCategoryInfo->m_cCmd);
}
}
}
}
std::sort(CMDArray.begin(), CMDArray.end());
CParseLog::Find(ResultArray, Result, CCategory(CMDArray));
ResultArray.swap(Result);
}
}
return true;
}
void CLogAnalyzer::Prev(CXListBox& Result, const size_t nShowNum, CString& Page)
{
if(m_nCurrentIndex > nShowNum)
{
m_nCurrentIndex -= nShowNum;
Show(Result, nShowNum, Page);
}
}
void CLogAnalyzer::Next(CXListBox& Result, const size_t nShowNum, CString& Page)
{
if(m_nCurrentIndex + nShowNum < m_ResultArray.size())
{
m_nCurrentIndex += nShowNum;
Show(Result, nShowNum, Page);
}
}
void CLogAnalyzer::MovePage(CXListBox& Result, const size_t nShowNum, CString& Page, unsigned int dwPageIndex)
{
if((nShowNum * dwPageIndex) < (m_ResultArray.size() + nShowNum))
{
m_nCurrentIndex = 0;
m_nCurrentIndex = nShowNum * (dwPageIndex - 1);
Show(Result, nShowNum, Page);
}
}
void CLogAnalyzer::SetShowMode(const BOOL bShowUID, const BOOL bShowCID,
const BOOL bShowTime, const BOOL bShowPosition)
{
m_dwShowMode = 0;
if(bShowUID) { m_dwShowMode = m_dwShowMode | GAMELOG::UID; }
if(bShowCID) { m_dwShowMode = m_dwShowMode | GAMELOG::CID; }
if(bShowTime) { m_dwShowMode = m_dwShowMode | GAMELOG::TIME; }
if(bShowPosition) { m_dwShowMode = m_dwShowMode | GAMELOG::POS; }
}
void CLogAnalyzer::Show(CXListBox& Result, const size_t nShowNum, CString& Page)
{
using namespace GAMELOG;
Result.ResetContent();
CXListBox::Color nBackColor = CXListBox::White;
CXListBox::Color nTextColor = CXListBox::Black;
CString LogLine;
CSize LogLineSize;
int nMaxSizeX = 0;
CDC* lpDC = Result.GetDC();
TEXTMETRIC tm;
lpDC->GetTextMetrics(&tm);
size_t nMaxShowNum = (m_ResultArray.size() < m_nCurrentIndex + nShowNum)
? m_ResultArray.size() : m_nCurrentIndex + nShowNum;
CParseLog::LogPtrArray::iterator begin = m_ResultArray.begin() + m_nCurrentIndex;
CParseLog::LogPtrArray::iterator end = m_ResultArray.begin() + nMaxShowNum;
CCategoryData& categoryData = CCategoryData::GetInstance();
for(int nCount = 0; begin != end; ++begin, ++nCount)
{
const sLogBase* lpLogBase = *begin;
LogLine = "";
SimpleInfo::BaseLog(LogLine, lpLogBase, m_dwShowMode);
nBackColor = CXListBox::White;
nTextColor = CXListBox::Black;
if(lpLogBase->m_cCmd < GAMELOG::CMD::MAX_LOGCMD)
{
CategoryInfo* lpInfo = categoryData.GetCategoryInfo(lpLogBase->m_cCmd);
if(0 != lpInfo && 0 != lpInfo->m_lpSimpleInfo)
{
lpInfo->m_lpSimpleInfo(LogLine, lpLogBase);
nTextColor = lpInfo->m_nFGColor;
nBackColor = lpInfo->m_nBGColor;
}
}
if(0 != LogLine.GetString())
{
LogLineSize = lpDC->GetTextExtent(LogLine);
LogLineSize.cx += tm.tmAveCharWidth;
if(LogLineSize.cx > nMaxSizeX)
{
nMaxSizeX = LogLineSize.cx;
}
Result.AddLine(nTextColor, nBackColor, LogLine);
}
}
Result.ReleaseDC(lpDC);
Result.SetHorizontalExtent(nMaxSizeX);
Page.Format(GetMyINIString("STRING_FOR_LOCALIZE", "FORMAT_002"),
m_nCurrentIndex/nShowNum + 1, m_ResultArray.size()/nShowNum + 1);
}
bool CLogAnalyzer::ShowDetail(int nSelect)
{
using namespace GAMELOG;
CParseLog::LogPtrArray::size_type nIndex = nSelect + m_nCurrentIndex;
if(nIndex >= m_ResultArray.size())
{
return false;
}
sLogBase* lpLogBase = m_ResultArray[nIndex];
CString DetailString;
switch(lpLogBase->m_cCmd)
{
case CMD::CHAR_LOGIN:
case CMD::CHAR_LOGOUT:
case CMD::CHAR_DBUPDATE: DetailInfo::ShowCharacterInfo(lpLogBase); break;
case CMD::CHAR_CREATE: DetailInfo::CharCreate(lpLogBase); break;
case CMD::CHAR_DELETE: DetailInfo::CharDelete(lpLogBase); break;
case CMD::CHAR_LEVELUP: DetailInfo::CharLevelUp(lpLogBase); break;
case CMD::CHAR_BIND_POS: DetailInfo::CharBindPos(lpLogBase); break;
case CMD::CHAR_DEAD: DetailInfo::CharDead(lpLogBase); break;
case CMD::CHAR_RESPAWN: DetailInfo::CharRespawn(lpLogBase); break;
case CMD::MOVE_ITEM: DetailInfo::MoveItem(lpLogBase); break;
case CMD::SWAP_ITEM: DetailInfo::SwapItem(lpLogBase); break;
case CMD::USE_ITEM: DetailInfo::UseItem(lpLogBase); break;
case CMD::SPLIT_ITEM: DetailInfo::SplitItem(lpLogBase); break;
case CMD::PICKUP_ITEM:
DetailString = GetMyINIString("STRING_FOR_LOCALIZE", "PICKUP_ITEM");
DetailInfo::PickupItem(DetailString, lpLogBase);
break;
case CMD::DROP_ITEM:
DetailString = GetMyINIString("STRING_FOR_LOCALIZE", "DROP_ITEM");
DetailInfo::DropItem(DetailString, lpLogBase);
break;
case CMD::USE_LOTTERY:
DetailInfo::UseLottery(lpLogBase);
break;
case CMD::SELL_ITEM:
DetailString = GetMyINIString("STRING_FOR_LOCALIZE", "SELL_ITEM");
DetailInfo::TradeItem(DetailString, lpLogBase);
break;
case CMD::BUY_ITEM:
DetailString = GetMyINIString("STRING_FOR_LOCALIZE", "BUY_ITEM");
DetailInfo::TradeItem(DetailString, lpLogBase);
break;
case CMD::BEFORE_EXCHANGE_ITEM:
case CMD::AFTER_EXCHANGE_ITEM:
DetailInfo::ExchangeItem(lpLogBase);
break;
case CMD::INSTALL_SOCKET_ITEM:
DetailInfo::InstallSocketItem(lpLogBase);
break;
case CMD::REPAIR_ITEM: break;
case CMD::CHANGE_WEAPON: break;
case CMD::TAKE_GOLD: break;
case CMD::UPGRADE_ITEM:
DetailInfo::UpgradeItem(lpLogBase);
break;
case CMD::STALL_OPEN_CLOSE: break;
case CMD::STALL_ENTER_LEAVE: break;
case CMD::STALL_ITEM_REGISTER_REMOVE: break;
case CMD::MEDAL_BUY_ITEM:
DetailString = GetMyINIString("STRING_FOR_LOCALIZE", "MEDAL_BUY_ITEM");
DetailInfo::TradeItem(DetailString, lpLogBase);
break;
case CMD::GUILD_CREATE:
case CMD::GUILD_JOIN:
case CMD::GUILD_MEMBER_LEVEL:
case CMD::GUILD_LEAVE:
case CMD::GUILD_LEVEL_ADJUST:
case CMD::GUILD_MARK_ADJUST:
case CMD::GUILD_GOLD_CHANGE:
case CMD::GUILD_DISSOLVE:
break;
case CMD::GUILD_RIGHTS_CHANGE:
DetailInfo::GuildRightsChange(lpLogBase);
break;
case CMD::ZONE_MOVE:
break;
case CMD::ITEM_ATTACH_OPTION:
DetailInfo::ItemAttachOption(lpLogBase);
break;
case CMD::ITEM_COMPENSATION:
DetailInfo::ItemCompensation(lpLogBase);
break;
case CMD::TICKET_BUY_SKILLBOOK:
DetailInfo::TradeItem(DetailString, lpLogBase);
break;
case CMD::UPGRADE_ITEM_V2:
DetailInfo::UpgradeItemV2(lpLogBase);
break;
case CMD::MONSTER_DEAD:
DetailInfo::MonsterDead(lpLogBase);
break;
case CMD::FAME_GET_BATTLE:
case CMD::FAME_LOSE_BATTLE:
case CMD::FAME_GET_CAMP:
case CMD::FAME_LOSE_CAMP:
case CMD::QUEST_GET_REWARD:
break;
case CMD::CHANGE_RIDE:
break;
case CMD::ILLEGAL_ITEM:
break;
case CMD::ILLEGAL_WARPPOS:
break;
case CMD::HACK_DOUBT:
DetailString = GetMyINIString("STRING_FOR_LOCALIZE", "BUY_ITEM");
DetailInfo::HackDoubtItem(DetailString, lpLogBase);
break;
default: return false;
}
return true;
}
bool CLogAnalyzer::WriteTextLog(const char* szFileName)
{
CFile WriteFile(szFileName, CFile::modeWrite | CFile::modeCreate);
CParseLog::LogPtrArray::iterator pos = m_ResultArray.begin();
CParseLog::LogPtrArray::iterator end = m_ResultArray.end();
CString LogLine;
CCategoryData& categoryData = CCategoryData::GetInstance();
for(;pos != end;++pos)
{
const GAMELOG::sLogBase* lpLogBase = *pos;
LogLine = "";
GAMELOG::SimpleInfo::BaseLog(LogLine, lpLogBase, m_dwShowMode);
if(lpLogBase->m_cCmd < GAMELOG::CMD::MAX_LOGCMD)
{
CategoryInfo* lpInfo = categoryData.GetCategoryInfo(lpLogBase->m_cCmd);
if(0 != lpInfo && 0 != lpInfo->m_lpSimpleInfo)
{
lpInfo->m_lpSimpleInfo(LogLine, lpLogBase);
LogLine += "\n";
}
}
if(0 != LogLine.GetString())
{
WriteFile.Write(LogLine, LogLine.GetLength());
}
}
return true;
}