ROWS;
- ROWS m_Rows; ///< ÷
+ ROWS m_Rows; ///< 행 컬렉션
public:
- /// \brief
+ /// \brief 생성자
cCsvFile() {}
- /// \brief Ҹ
+ /// \brief 소멸자
virtual ~cCsvFile() { Destroy(); }
public:
- /// \brief ̸ CSV εѴ.
+ /// \brief 지정된 이름의 CSV 파일을 로드한다.
bool Load(const char* fileName, const char seperator=',', const char quote='"');
- /// \brief ִ CSV Ͽ Ѵ.
+ /// \brief 가지고 있는 내용을 CSV 파일에다 저장한다.
bool Save(const char* fileName, bool append=false, char seperator=',', char quote='"') const;
- /// \brief Ѵ.
+ /// \brief 모든 데이터를 메모리에서 삭제한다.
void Destroy();
- /// \brief شϴ ε ȯѴ.
+ /// \brief 해당하는 인덱스의 행을 반환한다.
cCsvRow* operator [] (size_t index);
- /// \brief شϴ ε ȯѴ.
+ /// \brief 해당하는 인덱스의 행을 반환한다.
const cCsvRow* operator [] (size_t index) const;
- /// \brief ȯѴ.
+ /// \brief 행의 갯수를 반환한다.
size_t GetRowCount() const { return m_Rows.size(); }
private:
- /// \brief
+ /// \brief 복사 생성자 금지
cCsvFile(const cCsvFile&) {}
- /// \brief
+ /// \brief 대입 연산자 금지
const cCsvFile& operator = (const cCsvFile&) { return *this; }
};
////////////////////////////////////////////////////////////////////////////////
/// \class cCsvTable
-/// \brief CSV ̿ ̺ εϴ 찡 , Ŭ
-/// ۾ ϱ ƿƼ Ŭ.
+/// \brief CSV 파일을 이용해 테이블 데이터를 로드하는 경우가 많은데, 이 클래스는
+/// 그 작업을 좀 더 쉽게 하기 위해 만든 유틸리티 클래스다.
///
-/// CSV εϴ , ڸ ̿ ؾ ϴµ, CSV
-/// ٲ , ڵ Ѵ. ۾
-/// Ű 䱸ϴ ٰ, ϱ . Ƿ ڷ
-/// ϱ⺸ٴ ڿ ϴ ణ ٰ ִ.
+/// CSV 파일을 로드하는 경우, 숫자를 이용해 셀을 액세스해야 하는데, CSV
+/// 파일의 포맷이 바뀌는 경우, 이 숫자들을 변경해줘야한다. 이 작업이 꽤
+/// 신경 집중을 요구하는 데다가, 에러가 발생하기 쉽다. 그러므로 숫자로
+/// 액세스하기보다는 문자열로 액세스하는 것이 약간 느리지만 낫다고 할 수 있다.
///
/// sample
///
@@ -259,63 +259,63 @@ private:
class cCsvTable
{
public :
- cCsvFile m_File; ///< CSV ü
+ cCsvFile m_File; ///< CSV 파일 객체
private:
- cCsvAlias m_Alias; ///< ڿ ε ȯϱ ü
- int m_CurRow; ///< Ⱦ ȣ
+ cCsvAlias m_Alias; ///< 문자열을 셀 인덱스로 변환하기 위한 객체
+ int m_CurRow; ///< 현재 횡단 중인 행 번호
public:
- /// \brief
+ /// \brief 생성자
cCsvTable();
- /// \brief Ҹ
+ /// \brief 소멸자
virtual ~cCsvTable();
public:
- /// \brief ̸ CSV εѴ.
+ /// \brief 지정된 이름의 CSV 파일을 로드한다.
bool Load(const char* fileName, const char seperator=',', const char quote='"');
- /// \brief , ̸ Ѵ.
+ /// \brief 셀을 액세스할 때, 숫자 대신 사용할 이름을 등록한다.
void AddAlias(const char* name, size_t index) { m_Alias.AddAlias(name, index); }
- /// \brief Ѿ.
+ /// \brief 다음 행으로 넘어간다.
bool Next();
- /// \brief ڸ ȯѴ.
+ /// \brief 현재 행의 셀 숫자를 반환한다.
size_t ColCount() const;
- /// \brief ε ̿ int ȯѴ.
+ /// \brief 인덱스를 이용해 int 형으로 셀값을 반환한다.
int AsInt(size_t index) const;
- /// \brief ε ̿ double ȯѴ.
+ /// \brief 인덱스를 이용해 double 형으로 셀값을 반환한다.
double AsDouble(size_t index) const;
- /// \brief ε ̿ std::string ȯѴ.
+ /// \brief 인덱스를 이용해 std::string 형으로 셀값을 반환한다.
const char* AsStringByIndex(size_t index) const;
- /// \brief ̸ ̿ int ȯѴ.
+ /// \brief 셀 이름을 이용해 int 형으로 셀값을 반환한다.
int AsInt(const char* name) const { return AsInt(m_Alias[name]); }
- /// \brief ̸ ̿ double ȯѴ.
+ /// \brief 셀 이름을 이용해 double 형으로 셀값을 반환한다.
double AsDouble(const char* name) const { return AsDouble(m_Alias[name]); }
- /// \brief ̸ ̿ std::string ȯѴ.
+ /// \brief 셀 이름을 이용해 std::string 형으로 셀값을 반환한다.
const char* AsString(const char* name) const { return AsStringByIndex(m_Alias[name]); }
- /// \brief alias Ѵ.
+ /// \brief alias를 포함해 모든 데이터를 삭제한다.
void Destroy();
private:
- /// \brief ȯѴ.
+ /// \brief 현재 행을 반환한다.
const cCsvRow* const CurRow() const;
- /// \brief
+ /// \brief 복사 생성자 금지
cCsvTable(const cCsvTable&) {}
- /// \brief
+ /// \brief 대입 연산자 금지
const cCsvTable& operator = (const cCsvTable&) { return *this; }
};
diff --git a/src/db/src/DBManager.h b/src/db/src/DBManager.h
index f8b1d39..2ddeb88 100644
--- a/src/db/src/DBManager.h
+++ b/src/db/src/DBManager.h
@@ -2,9 +2,9 @@
#ifndef __INC_METIN2_DB_DBMANAGER_H__
#define __INC_METIN2_DB_DBMANAGER_H__
-// Ŀؼ Ŭ ... ؼ ƿ
-// ϵ óѴ.
-// ڵ by ķα Ƴ~ = _=)b
+// 디비 커넥션 클래스의 목적은... 디비에 접속해서 쿼리보내고 결과 받아오는
+// 모든 일들을 처리한다.
+// 코드 by 꼬붕 후로그래머 아노아~ = _=)b
#include
#define SQL_SAFE_LENGTH(size) (size * 2 + 1)
@@ -23,7 +23,6 @@ enum eSQL_SLOT
SQL_PLAYER,
SQL_ACCOUNT,
SQL_COMMON,
- SQL_HOTBACKUP,
SQL_MAX_NUM,
};
diff --git a/src/db/src/GuildManager.cpp b/src/db/src/GuildManager.cpp
index 75c08e1..5799b2f 100644
--- a/src/db/src/GuildManager.cpp
+++ b/src/db/src/GuildManager.cpp
@@ -242,7 +242,7 @@ void CGuildManager::ResultRanking(MYSQL_RES * pRes)
void CGuildManager::Update()
{
- ProcessReserveWar(); // ó
+ ProcessReserveWar(); // 예약 전쟁 처리
time_t now = CClientManager::instance().GetCurrentTime();
@@ -462,7 +462,7 @@ void CGuildManager::RemoveWar(DWORD GID1, DWORD GID2)
}
//
-// ʵ
+// 길드전 비정상 종료 및 필드전 종료
//
void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
{
@@ -493,7 +493,7 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
bool bDraw = false;
- if (!bForceDraw) // ºΰ ƴ 쿡 üũѴ.
+ if (!bForceDraw) // 강제 무승부가 아닐 경우에는 점수를 체크한다.
{
if (pData->iScore[0] > pData->iScore[1])
{
@@ -508,7 +508,7 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
else
bDraw = true;
}
- else // º 쿡 º
+ else // 강제 무승부일 경우에는 무조건 무승부
bDraw = true;
if (bDraw)
@@ -516,14 +516,14 @@ void CGuildManager::WarEnd(DWORD GID1, DWORD GID2, bool bForceDraw)
else
ProcessWinLose(win_guild, lose_guild);
- // DB ü ֱ Ŷ Ѵ.
+ // DB 서버에서 자체적으로 끝낼 때도 있기 때문에 따로 패킷을 보내줘야 한다.
CClientManager::instance().for_each_peer(FSendPeerWar(0, GUILD_WAR_END, GID1, GID2));
RemoveWar(GID1, GID2);
}
//
-//
+// 길드전 정상 종료
//
void CGuildManager::RecvWarOver(DWORD dwGuildWinner, DWORD dwGuildLoser, bool bDraw, int lWarPrice)
{
@@ -571,7 +571,7 @@ void CGuildManager::RecvWarOver(DWORD dwGuildWinner, DWORD dwGuildLoser, bool bD
void CGuildManager::RecvWarEnd(DWORD GID1, DWORD GID2)
{
SPDLOG_DEBUG("GuildWar: RecvWarEnded : {} vs {}", GID1, GID2);
- WarEnd(GID1, GID2, true); // Ѿ Ѵ.
+ WarEnd(GID1, GID2, true); // 무조건 비정상 종료 시켜야 한다.
}
void CGuildManager::StartWar(BYTE bType, DWORD GID1, DWORD GID2, CGuildWarReserve * pkReserve)
@@ -745,7 +745,7 @@ void CGuildManager::ChangeLadderPoint(DWORD GID, int change)
SPDLOG_DEBUG("GuildManager::ChangeLadderPoint {} {}", GID, r.ladder_point);
SPDLOG_DEBUG("{}", buf);
- // Packet
+ // Packet 보내기
TPacketGuildLadder p;
p.dwGuild = GID;
@@ -808,7 +808,7 @@ void CGuildManager::WithdrawMoney(CPeer* peer, DWORD dwGuild, INT iGold)
return;
}
- // ϰ ÷ش
+ // 돈이있으니 출금하고 올려준다
if (it->second.gold >= iGold)
{
it->second.gold -= iGold;
@@ -839,7 +839,7 @@ void CGuildManager::WithdrawMoneyReply(DWORD dwGuild, BYTE bGiveSuccess, INT iGo
}
//
-// (ڰ ִ)
+// 예약 길드전(관전자가 배팅할 수 있다)
//
const int c_aiScoreByLevel[GUILD_MAX_LEVEL+1] =
{
@@ -869,7 +869,7 @@ const int c_aiScoreByLevel[GUILD_MAX_LEVEL+1] =
const int c_aiScoreByRanking[GUILD_RANK_MAX_NUM+1] =
{
0,
- 55000, // 1
+ 55000, // 1위
50000,
45000,
40000,
@@ -878,7 +878,7 @@ const int c_aiScoreByRanking[GUILD_RANK_MAX_NUM+1] =
28000,
24000,
21000,
- 18000, // 10
+ 18000, // 10위
15000,
12000,
10000,
@@ -888,7 +888,7 @@ const int c_aiScoreByRanking[GUILD_RANK_MAX_NUM+1] =
3000,
2000,
1000,
- 500 // 20
+ 500 // 20위
};
void CGuildManager::BootReserveWar()
@@ -932,8 +932,8 @@ void CGuildManager::BootReserveWar()
char buf[512];
snprintf(buf, sizeof(buf), "GuildWar: BootReserveWar : step %d id %u GID1 %u GID2 %u", i, t.dwID, t.dwGuildFrom, t.dwGuildTo);
- // i == 0 ̸ DB ƨ ̹Ƿ º óѴ.
- // Ǵ, 5 º óѴ. ( þ ش)
+ // i == 0 이면 길드전 도중 DB가 튕긴 것이므로 무승부 처리한다.
+ // 또는, 5분 이하 남은 예약 길드전도 무승부 처리한다. (각자의 배팅액을 돌려준다)
//if (i == 0 || (int) t.dwTime - CClientManager::instance().GetCurrentTime() < 60 * 5)
if (i == 0 || (int) t.dwTime - CClientManager::instance().GetCurrentTime() < 0)
{
@@ -1010,7 +1010,7 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
int lvp, rkp, alv, mc;
- // Ŀ
+ // 파워 계산
TGuild & k1 = TouchGuild(GID1);
lvp = c_aiScoreByLevel[std::min(GUILD_MAX_LEVEL, k1.level)];
@@ -1026,7 +1026,7 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
t.lPowerFrom = (int) polyPower.Eval();
SPDLOG_DEBUG("GuildWar: {} lvp {} rkp {} alv {} mc {} power {}", GID1, lvp, rkp, alv, mc, t.lPowerFrom);
- // Ŀ
+ // 파워 계산
TGuild & k2 = TouchGuild(GID2);
lvp = c_aiScoreByLevel[std::min(GUILD_MAX_LEVEL, k2.level)];
@@ -1042,7 +1042,7 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
t.lPowerTo = (int) polyPower.Eval();
SPDLOG_DEBUG("GuildWar: {} lvp {} rkp {} alv {} mc {} power {}", GID2, lvp, rkp, alv, mc, t.lPowerTo);
- // ڵĸ
+ // 핸디캡 계산
if (t.lPowerTo > t.lPowerFrom)
{
polyHandicap.SetVar("pA", t.lPowerTo);
@@ -1057,7 +1057,7 @@ bool CGuildManager::ReserveWar(TPacketGuildWar * p)
t.lHandicap = (int) polyHandicap.Eval();
SPDLOG_DEBUG("GuildWar: handicap {}", t.lHandicap);
- //
+ // 쿼리
char szQuery[512];
snprintf(szQuery, sizeof(szQuery),
@@ -1094,7 +1094,7 @@ void CGuildManager::ProcessReserveWar()
CGuildWarReserve * pk = it2->second;
TGuildWarReserve & r = pk->GetDataRef();
- if (!r.bStarted && r.dwTime - 1800 <= dwCurTime) // 30 ˸.
+ if (!r.bStarted && r.dwTime - 1800 <= dwCurTime) // 30분 전부터 알린다.
{
int iMin = (int) ceil((int)(r.dwTime - dwCurTime) / 60.0);
@@ -1135,9 +1135,9 @@ void CGuildManager::ProcessReserveWar()
pk->SetLastNoticeMin(iMin);
if (!g_stLocale.compare("euckr"))
- CClientManager::instance().SendNotice("%s %s %d ˴ϴ!", r_1.szName, r_2.szName, iMin);
+ CClientManager::instance().SendNotice("The war between guild %s and guild %s will begin in approximately %d minutes!", r_1.szName, r_2.szName, iMin);
else if (!g_stLocale.compare("gb2312"))
- CClientManager::instance().SendNotice("%s %s İս %dӺʼ!", r_1.szName, r_2.szName, iMin);
+ CClientManager::instance().SendNotice("The war between guild %s and guild %s will begin in approximately %d minutes!", r_1.szName, r_2.szName, iMin);
}
}
}
@@ -1239,7 +1239,7 @@ void CGuildWarReserve::Initialize()
void CGuildWarReserve::OnSetup(CPeer * peer)
{
- if (m_data.bStarted) // ̹ ۵ ʴ´.
+ if (m_data.bStarted) // 이미 시작된 것은 보내지 않는다.
return;
FSendPeerWar(m_data.bType, GUILD_WAR_RESERVE, m_data.dwGuildFrom, m_data.dwGuildTo) (peer);
@@ -1325,8 +1325,8 @@ bool CGuildWarReserve::Bet(const char * pszLogin, DWORD dwGold, DWORD dwGuild)
}
//
-// º ó: κ ºΰ , Ư Ȳ 쿡
-// º ó ־ Ѵ.
+// 무승부 처리: 대부분 승부가 나야 정상이지만, 서버 문제 등 특정 상황일 경우에는
+// 무승부 처리가 있어야 한다.
//
void CGuildWarReserve::Draw()
{
@@ -1458,7 +1458,7 @@ void CGuildWarReserve::End(int iScoreFrom, int iScoreTo)
double ratio = (double) it->second.second / dwWinnerBet;
- // 10% й
+ // 10% 세금 공제 후 분배
SPDLOG_DEBUG("WAR_REWARD: {} {} ratio {}", it->first.c_str(), it->second.second, ratio);
DWORD dwGold = (DWORD) (dwTotalBet * ratio * 0.9);
diff --git a/src/db/src/GuildManager.h b/src/db/src/GuildManager.h
index 26227bc..0ca963e 100644
--- a/src/db/src/GuildManager.h
+++ b/src/db/src/GuildManager.h
@@ -150,7 +150,7 @@ class CGuildWarReserve
void SetLastNoticeMin(int iMin) { m_iLastNoticeMin = iMin; }
private:
- CGuildWarReserve(); // ⺻ ڸ ϵ ǵ
+ CGuildWarReserve(); // 기본 생성자를 사용하지 못하도록 의도적으로 구현하지 않음
TGuildWarReserve m_data;
// >
@@ -235,7 +235,7 @@ class CGuildManager : public singleton
std::map m_map_kGuild;
std::map > m_mapGuildWarEndTime;
- std::set m_DeclareMap; // ¸
+ std::set m_DeclareMap; // 선전 포고 상태를 저장
std::map > m_WarMap;
typedef std::pair stPairGuildWar;
diff --git a/src/db/src/HB.cpp b/src/db/src/HB.cpp
deleted file mode 100644
index 8e899fe..0000000
--- a/src/db/src/HB.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#include "stdafx.h"
-#include "HB.h"
-#include "Main.h"
-#include "DBManager.h"
-
-#include
-
-PlayerHB::PlayerHB()
-{
- m_iExpireTime = 3600; // 1 hour hotbackup default.
-}
-
-PlayerHB::~PlayerHB()
-{
-}
-
-bool PlayerHB::Initialize()
-{
- char szQuery[128];
- snprintf(szQuery, sizeof(szQuery), "SHOW CREATE TABLE player%s", GetTablePostfix());
-
- std::unique_ptr pMsg(CDBManager::instance().DirectQuery(szQuery));
-
- if (pMsg->Get()->uiNumRows == 0)
- return false;
-
- MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
- m_stCreateTableQuery = row[1];
- return true;
-}
-
-//
-// @version 05/07/05 Bang2ni - id شϴ data ϰ data insert ϴڵ ߰.
-//
-void PlayerHB::Put(DWORD id)
-{
- itertype(m_map_data) it = m_map_data.find(id);
-
- if (it == m_map_data.end())
- {
- Query(id);
- m_map_data.insert(std::pair< DWORD, time_t >(id, get_dword_time()));
- return;
- }
-
- if (time(0) - it->second > m_iExpireTime)
- Query(id);
-}
-
-//
-// @version 05/07/05 Bang2ni - Query string ۰ ۾Ƽ ÷.
-//
-bool PlayerHB::Query(DWORD id)
-{
- time_t ct = time(0);
- struct tm curr_tm = *localtime(&ct);
- char szTableName[64];
- snprintf(szTableName, sizeof(szTableName), "hb_%02d%02d%02d%02d_player%s",
- curr_tm.tm_year - 100, curr_tm.tm_mon + 1, curr_tm.tm_mday, curr_tm.tm_hour, GetTablePostfix());
-
- char szQuery[4096];
-
- if (m_stTableName.compare(szTableName))
- {
- char szFind[32];
- snprintf(szFind, sizeof(szFind), "CREATE TABLE `player%s`", GetTablePostfix());
- int pos = m_stCreateTableQuery.find(szFind);
-
- if (pos < 0)
- {
- SPDLOG_ERROR("cannot find {} ", szFind);
- // SPDLOG_ERROR("cannot find {} in {}", szFind, m_stCreateTableQuery.c_str());
- return false;
- }
-
- snprintf(szQuery, sizeof(szQuery), "CREATE TABLE IF NOT EXISTS %s%s", szTableName, m_stCreateTableQuery.c_str() + strlen(szFind));
- // SPDLOG_DEBUG("{}", szQuery);
- std::unique_ptr pMsg(CDBManager::instance().DirectQuery(szQuery, SQL_HOTBACKUP));
- m_stTableName = szTableName;
- }
-
- snprintf(szQuery, sizeof(szQuery), "REPLACE INTO %s SELECT * FROM %splayer%s WHERE id=%u", m_stTableName.c_str(), GetPlayerDBName(), GetTablePostfix(), id);
- CDBManager::instance().AsyncQuery(szQuery, SQL_HOTBACKUP);
- return true;
-}
-
diff --git a/src/db/src/HB.h b/src/db/src/HB.h
deleted file mode 100644
index 8c5da77..0000000
--- a/src/db/src/HB.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// vim:ts=8 sw=4
-#ifndef __INC_METIN_II_PLAYERHB_H__
-#define __INC_METIN_II_PLAYERHB_H__
-
-class PlayerHB : public singleton
-{
- public:
- PlayerHB();
- virtual ~PlayerHB();
-
- bool Initialize();
-
- void Put(DWORD id);
-
- private:
- bool Query(DWORD id);
-
- std::map m_map_data;
- std::string m_stCreateTableQuery;
- std::string m_stTableName;
- int m_iExpireTime;
-};
-
-#endif
diff --git a/src/db/src/ItemAwardManager.cpp b/src/db/src/ItemAwardManager.cpp
index 7012130..32a0d88 100644
--- a/src/db/src/ItemAwardManager.cpp
+++ b/src/db/src/ItemAwardManager.cpp
@@ -54,19 +54,19 @@ void ItemAwardManager::Load(SQLMsg * pMsg)
if (row[col])
{
strlcpy(kData->szWhy, row[col], sizeof(kData->szWhy));
- // ߿ whyݷ뿡
- char* whyStr = kData->szWhy; //why ݷ б
- char cmdStr[100] = ""; //whyݷ뿡 ӽ ڿ ص
- strcpy(cmdStr,whyStr); //ɾ ū ūȭ DZ
+ //게임 중에 why콜룸에 변동이 생기면
+ char* whyStr = kData->szWhy; //why 콜룸 읽기
+ char cmdStr[100] = ""; //why콜룸에서 읽은 값을 임시 문자열에 복사해둠
+ strcpy(cmdStr,whyStr); //명령어 얻는 과정에서 토큰쓰면 원본도 토큰화 되기 때문
char command[20] = "";
- strcpy(command,CClientManager::instance().GetCommand(cmdStr).c_str()); // command
+ strcpy(command,CClientManager::instance().GetCommand(cmdStr).c_str()); // command 얻기
//SPDLOG_ERROR("{}, {}",pItemAward->dwID,command);
- if( !(strcmp(command,"GIFT") )) // command GIFT̸
+ if( !(strcmp(command,"GIFT") )) // command 가 GIFT이면
{
TPacketItemAwardInfromer giftData;
- strcpy(giftData.login, kData->szLogin); //α ̵
- strcpy(giftData.command, command); //ɾ
- giftData.vnum = kData->dwVnum; // vnum
+ strcpy(giftData.login, kData->szLogin); //로그인 아이디 복사
+ strcpy(giftData.command, command); //명령어 복사
+ giftData.vnum = kData->dwVnum; //아이템 vnum도 복사
CClientManager::instance().ForwardPacket(HEADER_DG_ITEMAWARD_INFORMER,&giftData,sizeof(TPacketItemAwardInfromer));
}
}
diff --git a/src/db/src/LoginData.cpp b/src/db/src/LoginData.cpp
index dbcec54..5ef328c 100644
--- a/src/db/src/LoginData.cpp
+++ b/src/db/src/LoginData.cpp
@@ -11,8 +11,6 @@ CLoginData::CLoginData()
memset(m_szIP, 0, sizeof(m_szIP));
m_bPlay = false;
m_bDeleted = false;
- m_bBillType = 0;
- m_dwBillID = 0;
m_lastPlayTime = 0;
m_dwLastPlayerID = 0;
diff --git a/src/db/src/LoginData.h b/src/db/src/LoginData.h
index 9c6c085..debd493 100644
--- a/src/db/src/LoginData.h
+++ b/src/db/src/LoginData.h
@@ -29,12 +29,6 @@ class CLoginData
void SetDeleted(bool bSet);
bool IsDeleted();
- void SetBillID(DWORD id) { m_dwBillID = id; }
- DWORD GetBillID() { return m_dwBillID; }
-
- void SetBillType(BYTE type) { m_bBillType = type; }
- BYTE GetBillType() { return m_bBillType; }
-
time_t GetLastPlayTime() { return m_lastPlayTime; }
void SetPremium(DWORD * paiPremiumTimes);
@@ -53,8 +47,6 @@ class CLoginData
bool m_bPlay;
bool m_bDeleted;
- BYTE m_bBillType;
- DWORD m_dwBillID;
time_t m_lastPlayTime;
DWORD m_aiPremiumTimes[PREMIUM_MAX_NUM];
diff --git a/src/db/src/Main.cpp b/src/db/src/Main.cpp
index ac392cb..030d872 100644
--- a/src/db/src/Main.cpp
+++ b/src/db/src/Main.cpp
@@ -5,12 +5,10 @@
#include "ClientManager.h"
#include "GuildManager.h"
#include "ItemAwardManager.h"
-#include "HB.h"
#include "PrivManager.h"
#include "MoneyLog.h"
#include "Marriage.h"
#include "Monarch.h"
-#include "BlockCountry.h"
#include "ItemIDRangeManager.h"
#include
#ifdef __AUCTION__
@@ -18,24 +16,21 @@
#endif
#include
-void SetPlayerDBName(const char* c_pszPlayerDBName);
void SetTablePostfix(const char* c_pszTablePostfix);
int Start();
std::string g_stTablePostfix;
std::string g_stLocaleNameColumn = "name";
std::string g_stLocale = "euckr";
-std::string g_stPlayerDBName = "";
-bool g_bHotBackup = false;
BOOL g_test_server = false;
-//
+//단위 초
int g_iPlayerCacheFlushSeconds = 60*7;
int g_iItemCacheFlushSeconds = 60*5;
-//g_iLogoutSeconds ġ g_iPlayerCacheFlushSeconds g_iItemCacheFlushSeconds Ѵ.
+//g_iLogoutSeconds 수치는 g_iPlayerCacheFlushSeconds 와 g_iItemCacheFlushSeconds 보다 길어야 한다.
int g_iLogoutSeconds = 60*10;
@@ -70,14 +65,12 @@ int main()
CConfig Config;
CDBManager DBManager;
CClientManager ClientManager;
- PlayerHB player_hb;
CGuildManager GuildManager;
CPrivManager PrivManager;
CMoneyLog MoneyLog;
ItemAwardManager ItemAwardManager;
marriage::CManager MarriageManager;
CMonarch Monarch;
- CBlockCountry BlockCountry;
CItemIDRangeManager ItemIDRangeManager;
#ifdef __AUCTION__
AuctionManager auctionManager;
@@ -87,7 +80,6 @@ int main()
GuildManager.Initialize();
MarriageManager.Initialize();
- BlockCountry.Load();
ItemIDRangeManager.Build();
#ifdef __AUCTION__
AuctionManager::instance().Initialize();
@@ -101,7 +93,7 @@ int main()
DBManager.Quit();
int iCount;
- while (1)
+ while (true)
{
iCount = 0;
@@ -122,19 +114,19 @@ int main()
void emptybeat(LPHEART heart, int pulse)
{
- if (!(pulse % heart->passes_per_sec)) // 1ʿ ѹ
+ if (!(pulse % heart->passes_per_sec)) // 1초에 한번
{
}
}
//
-// @version 05/06/13 Bang2ni - ij flush timeout ߰.
+// @version 05/06/13 Bang2ni - 아이템 가격정보 캐시 flush timeout 설정 추가.
//
int Start()
{
- if (!CConfig::instance().LoadFile("conf.txt"))
+ if (!CConfig::instance().LoadFile("db.conf"))
{
- SPDLOG_ERROR("Loading conf.txt failed.");
+ SPDLOG_ERROR("Loading db.conf failed.");
return false;
}
@@ -170,27 +162,8 @@ int Start()
{
g_stLocale = szBuf;
SPDLOG_INFO("LOCALE set to {}", g_stLocale.c_str());
-
- // CHINA_DISABLE_HOTBACKUP
- if ("gb2312" == g_stLocale)
- {
- SPDLOG_INFO("CIBN_LOCALE: DISABLE_HOTBACKUP");
- g_bHotBackup = false;
- }
- // END_OF_CHINA_DISABLE_HOTBACKUP
}
- int iDisableHotBackup;
- if (CConfig::instance().GetValue("DISABLE_HOTBACKUP", &iDisableHotBackup))
- {
- if (iDisableHotBackup)
- {
- SPDLOG_INFO("CONFIG: DISABLE_HOTBACKUP");
- g_bHotBackup = false;
- }
- }
-
-
if (!CConfig::instance().GetValue("TABLE_POSTFIX", szBuf, 256))
{
SPDLOG_WARN("TABLE_POSTFIX not configured use default");
@@ -244,112 +217,56 @@ int Start()
int iPort;
char line[256+1];
- if (CConfig::instance().GetValue("SQL_PLAYER", line, 256))
- {
+ if (CConfig::instance().GetValue("SQL_PLAYER", line, 256)) {
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
SPDLOG_DEBUG("Connecting to MySQL server (player)");
- int iRetry = 5;
+ if (!CDBManager::instance().Connect(SQL_PLAYER, szAddr, iPort, szDB, szUser, szPassword)) {
+ SPDLOG_CRITICAL("Connection to MySQL server (player) failed!");
+ return false;
+ }
- do
- {
- if (CDBManager::instance().Connect(SQL_PLAYER, szAddr, iPort, szDB, szUser, szPassword))
- {
- SPDLOG_INFO("Connected to MySQL server (player)");
- break;
- }
-
- SPDLOG_ERROR("Connection to MySQL server (player) failed, retrying in 5 seconds");
- sleep(5);
- } while (iRetry--);
- SetPlayerDBName(szDB);
+ SPDLOG_INFO("Connected to MySQL server (player)");
}
- else
- {
- SPDLOG_ERROR("SQL_PLAYER not configured");
+ else {
+ SPDLOG_CRITICAL("SQL_PLAYER not configured");
return false;
}
- if (CConfig::instance().GetValue("SQL_ACCOUNT", line, 256))
- {
+ if (CConfig::instance().GetValue("SQL_ACCOUNT", line, 256)) {
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
- SPDLOG_DEBUG("connecting to MySQL server (account)");
+ SPDLOG_DEBUG("Connecting to MySQL server (account)");
- int iRetry = 5;
+ if (!CDBManager::instance().Connect(SQL_ACCOUNT, szAddr, iPort, szDB, szUser, szPassword)) {
+ SPDLOG_CRITICAL("Connection to MySQL server (account) failed!");
+ return false;
+ }
- do
- {
- if (CDBManager::instance().Connect(SQL_ACCOUNT, szAddr, iPort, szDB, szUser, szPassword))
- {
- SPDLOG_DEBUG(" OK");
- break;
- }
-
- SPDLOG_DEBUG(" failed, retrying in 5 seconds");
- SPDLOG_ERROR(" failed, retrying in 5 seconds");
- sleep(5);
- } while (iRetry--);
- SPDLOG_INFO("Success ACCOUNT");
+ SPDLOG_INFO("Connected to MySQL server (account)");
}
else
{
- SPDLOG_ERROR("SQL_ACCOUNT not configured");
+ SPDLOG_CRITICAL("SQL_ACCOUNT not configured");
return false;
}
if (CConfig::instance().GetValue("SQL_COMMON", line, 256))
{
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
- SPDLOG_DEBUG("connecting to MySQL server (common)");
+ SPDLOG_DEBUG("Connecting to MySQL server (common)");
- int iRetry = 5;
- do
+ if (!CDBManager::instance().Connect(SQL_COMMON, szAddr, iPort, szDB, szUser, szPassword))
{
- if (CDBManager::instance().Connect(SQL_COMMON, szAddr, iPort, szDB, szUser, szPassword))
- {
- SPDLOG_DEBUG(" OK");
- break;
- }
-
- SPDLOG_DEBUG(" failed, retrying in 5 seconds");
- SPDLOG_ERROR(" failed, retrying in 5 seconds");
- sleep(5);
- } while (iRetry--);
- SPDLOG_INFO("Success COMMON");
- }
- else
- {
- SPDLOG_ERROR("SQL_COMMON not configured");
- return false;
- }
-
- if (CConfig::instance().GetValue("SQL_HOTBACKUP", line, 256))
- {
- sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
- SPDLOG_DEBUG("connecting to MySQL server (hotbackup)");
-
- int iRetry = 5;
-
- do
- {
- if (CDBManager::instance().Connect(SQL_HOTBACKUP, szAddr, iPort, szDB, szUser, szPassword))
- {
- SPDLOG_DEBUG(" OK");
- break;
- }
-
- SPDLOG_DEBUG(" failed, retrying in 5 seconds");
- SPDLOG_ERROR(" failed, retrying in 5 seconds");
- sleep(5);
+ SPDLOG_CRITICAL("Connection to MySQL server (common) failed!");
+ return false;
}
- while (iRetry--);
- SPDLOG_INFO("Success HOTBACKUP");
+ SPDLOG_INFO("Connected to MySQL server (common)");
}
else
{
- SPDLOG_ERROR("SQL_HOTBACKUP not configured");
+ SPDLOG_CRITICAL("SQL_COMMON not configured");
return false;
}
@@ -361,12 +278,6 @@ int Start()
SPDLOG_INFO("ClientManager initialization OK");
- if (!PlayerHB::instance().Initialize())
- {
- SPDLOG_ERROR("cannot initialize player hotbackup");
- return false;
- }
-
#ifndef __WIN32__
signal(SIGUSR1, emergency_sig);
#endif
@@ -386,20 +297,3 @@ const char * GetTablePostfix()
{
return g_stTablePostfix.c_str();
}
-
-void SetPlayerDBName(const char* c_pszPlayerDBName)
-{
- if (! c_pszPlayerDBName || ! *c_pszPlayerDBName)
- g_stPlayerDBName = "";
- else
- {
- g_stPlayerDBName = c_pszPlayerDBName;
- g_stPlayerDBName += ".";
- }
-}
-
-const char * GetPlayerDBName()
-{
- return g_stPlayerDBName.c_str();
-}
-
diff --git a/src/db/src/Marriage.cpp b/src/db/src/Marriage.cpp
index f42df95..b7e3a4e 100644
--- a/src/db/src/Marriage.cpp
+++ b/src/db/src/Marriage.cpp
@@ -253,7 +253,7 @@ namespace marriage
void CManager::OnSetup(CPeer* peer)
{
- // ȥ
+ // 결혼한 사람들 보내기
for (itertype(m_Marriages) it = m_Marriages.begin(); it != m_Marriages.end(); ++it)
{
TMarriage* pMarriage = *it;
@@ -280,7 +280,7 @@ namespace marriage
}
}
- // ȥ
+ // 결혼식 보내기
for (itertype(m_mapRunningWedding) it = m_mapRunningWedding.begin(); it != m_mapRunningWedding.end(); ++it)
{
const TWedding& t = it->second;
diff --git a/src/db/src/Marriage.h b/src/db/src/Marriage.h
index 6758c8a..149df9e 100644
--- a/src/db/src/Marriage.h
+++ b/src/db/src/Marriage.h
@@ -49,7 +49,7 @@ namespace marriage
DWORD pid2;
int love_point;
DWORD time;
- BYTE is_married; // false : ȥ , true : ȥ
+ BYTE is_married; // false : 약혼 상태, true : 결혼 상태
std::string name1;
std::string name2;
diff --git a/src/db/src/Monarch.cpp b/src/db/src/Monarch.cpp
index 3c38fe7..5fe7ba5 100644
--- a/src/db/src/Monarch.cpp
+++ b/src/db/src/Monarch.cpp
@@ -233,7 +233,7 @@ bool CMonarch::SetMonarch(const char * name)
}
delete pMsg;
- //db Է
+ //db에 입력
snprintf(szQuery, sizeof(szQuery),
"REPLACE INTO monarch (empire, name, windate, money) VALUES(%d, %d, now(), %ld)", Empire, p->pid[Empire], p->money[Empire]);
diff --git a/src/db/src/Peer.h b/src/db/src/Peer.h
index 46e1a87..dc2dc96 100644
--- a/src/db/src/Peer.h
+++ b/src/db/src/Peer.h
@@ -64,9 +64,9 @@ class CPeer : public CPeerBase
BYTE m_bChannel;
DWORD m_dwHandle;
DWORD m_dwUserCount;
- WORD m_wListenPort; // Ӽ Ŭ̾Ʈ listen ϴ Ʈ
- WORD m_wP2PPort; // Ӽ Ӽ P2P listen ϴ Ʈ
- LONG m_alMaps[MAP_ALLOW_MAX_LEN]; // ϰ ִ°?
+ WORD m_wListenPort; // 게임서버가 클라이언트를 위해 listen 하는 포트
+ WORD m_wP2PPort; // 게임서버가 게임서버 P2P 접속을 위해 listen 하는 포트
+ LONG m_alMaps[MAP_ALLOW_MAX_LEN]; // 어떤 맵을 관장하고 있는가?
TItemIDRangeTable m_itemRange;
TItemIDRangeTable m_itemSpareRange;
diff --git a/src/db/src/PrivManager.cpp b/src/db/src/PrivManager.cpp
index ede3c4e..ab1cb94 100644
--- a/src/db/src/PrivManager.cpp
+++ b/src/db/src/PrivManager.cpp
@@ -20,7 +20,7 @@ CPrivManager::~CPrivManager()
}
//
-// @version 05/06/07 Bang2ni - ߺ ʽ 忡 ó
+// @version 05/06/07 Bang2ni - 중복적으로 보너스가 적용 된 길드에 대한 처리
//
void CPrivManager::Update()
{
@@ -37,8 +37,8 @@ void CPrivManager::Update()
typeof(m_aPrivGuild[p->type].begin()) it = m_aPrivGuild[p->type].find(p->guild_id);
// ADD_GUILD_PRIV_TIME
- // 忡 ߺ ʽ Ǿ map value () ǾǷ
- // TPrivGuildData Ͱ ְ Ӽ鿡 cast ش.
+ // 길드에 중복적으로 보너스가 설정되었을 경우 map 의 value 가 갱신(수정) 되었으므로
+ // TPrivGuildData 의 포인터가 같을때 실제로 삭제해 주고 게임서버들에게 cast 해 준다.
if (it != m_aPrivGuild[p->type].end() && it->second == p) {
m_aPrivGuild[p->type].erase(it);
SendChangeGuildPriv(p->guild_id, p->type, 0, 0);
@@ -113,7 +113,7 @@ void CPrivManager::AddCharPriv(DWORD pid, BYTE type, int value)
}
//
-// @version 05/06/07 Bang2ni - ̹ ʽ 忡 ʽ
+// @version 05/06/07 Bang2ni - 이미 보너스가 적용 된 길드에 보너스 설정
//
void CPrivManager::AddGuildPriv(DWORD guild_id, BYTE type, int value, time_t duration_sec)
{
@@ -131,8 +131,8 @@ void CPrivManager::AddGuildPriv(DWORD guild_id, BYTE type, int value, time_t dur
m_pqPrivGuild.push(std::make_pair(end, p));
// ADD_GUILD_PRIV_TIME
- // ̹ ʽ ִٸ map value ش.
- // value ʹ priority queue ȴ.
+ // 이미 보너스가 설정되 있다면 map 의 value 를 갱신해 준다.
+ // 이전 value 의 포인터는 priority queue 에서 삭제될 때 해제된다.
if (it != m_aPrivGuild[type].end())
it->second = p;
else
@@ -158,8 +158,8 @@ void CPrivManager::AddEmpirePriv(BYTE empire, BYTE type, int value, time_t durat
time_t now = CClientManager::instance().GetCurrentTime();
time_t end = now+duration_sec;
- // ȿȭ
- // priority_queue ִ pointer == m_aaPrivEmpire[type][empire]
+ // 이전 설정값 무효화
+ // priority_queue에 들어있는 pointer == m_aaPrivEmpire[type][empire]
{
if (m_aaPrivEmpire[type][empire])
m_aaPrivEmpire[type][empire]->bRemoved = true;
@@ -177,7 +177,7 @@ void CPrivManager::AddEmpirePriv(BYTE empire, BYTE type, int value, time_t durat
}
/**
- * @version 05/06/08 Bang2ni - ӽð ߰
+ * @version 05/06/08 Bang2ni - 지속시간 추가
*/
struct FSendChangeGuildPriv
{
diff --git a/src/db/src/PrivManager.h b/src/db/src/PrivManager.h
index 9dd20df..95eb367 100644
--- a/src/db/src/PrivManager.h
+++ b/src/db/src/PrivManager.h
@@ -23,7 +23,7 @@ struct TPrivEmpireData
};
/**
- * @version 05/06/08 Bang2ni - ӽð ߰
+ * @version 05/06/08 Bang2ni - 지속시간 추가
*/
struct TPrivGuildData
{
@@ -33,7 +33,7 @@ struct TPrivGuildData
DWORD guild_id;
// ADD_GUILD_PRIV_TIME
- time_t end_time_sec; ///< ӽð
+ time_t end_time_sec; ///< 지속시간
TPrivGuildData(BYTE type, int value, DWORD guild_id, time_t _end_time_sec)
: type(type), value(value), bRemoved(false), guild_id(guild_id), end_time_sec(_end_time_sec )
@@ -53,7 +53,7 @@ struct TPrivCharData
};
/**
- * @version 05/06/08 Bang2ni - Guild privilege Լ ð ߰
+ * @version 05/06/08 Bang2ni - Guild privilege 관련 함수 지속 시간 추가
*/
class CPrivManager : public singleton
{
diff --git a/src/db/src/ProtoReader.cpp b/src/db/src/ProtoReader.cpp
index 21cdb22..f38a8f2 100644
--- a/src/db/src/ProtoReader.cpp
+++ b/src/db/src/ProtoReader.cpp
@@ -25,23 +25,23 @@ string trim(const string& str){return trim_left(trim_right(str));}
static string* StringSplit(string strOrigin, string strTok)
{
- int cutAt; //ڸġ
- int index = 0; //ڿε
- string* strResult = new string[30]; //return Һ
+ int cutAt; //자르는위치
+ int index = 0; //문자열인덱스
+ string* strResult = new string[30]; //결과return 할변수
- //strTokãݺ
+ //strTok을찾을때까지반복
while ((cutAt = strOrigin.find_first_of(strTok)) != strOrigin.npos)
{
- if (cutAt > 0) //ڸġ0ũ()
+ if (cutAt > 0) //자르는위치가0보다크면(성공시)
{
- strResult[index++] = strOrigin.substr(0, cutAt); //迭߰
+ strResult[index++] = strOrigin.substr(0, cutAt); //결과배열에추가
}
- strOrigin = strOrigin.substr(cutAt+1); //ڸκѳ
+ strOrigin = strOrigin.substr(cutAt+1); //원본은자른부분제외한나머지
}
- if(strOrigin.length() > 0) //̾
+ if(strOrigin.length() > 0) //원본이아직남았으면
{
- strResult[index++] = strOrigin.substr(0, cutAt); //迭߰
+ strResult[index++] = strOrigin.substr(0, cutAt); //나머지를결과배열에추가
}
for( int i=0;i type_value && "Subtype rule: Out of range!!");
- // assert ..
+ // assert 안 먹히는 듯..
if (_countof(arSubType) <= type_value)
{
SPDLOG_ERROR("SubType : Out of range!! (type_value: {}, count of registered subtype: {}", type_value, _countof(arSubType));
return -1;
}
- // Ÿ Ÿ ̰ ϴ ˾ƺ, 0
+ //아이템 타입의 서브타입 어레이가 존재하는지 알아보고, 없으면 0 리턴
if (arSubType[type_value]==0) {
return 0;
}
@@ -246,13 +246,13 @@ int get_Item_AntiFlag_Value(string inputString)
int retValue = 0;
- string* arInputString = StringSplit(inputString, "|"); // ܾ ɰ 迭.
+ string* arInputString = StringSplit(inputString, "|"); //프로토 정보 내용을 단어별로 쪼갠 배열.
for(int i =0;i &nameMap)
{
int col = 0;
str_to_number(mobTable->dwVnum, csvTable.AsStringByIndex(col++));
strlcpy(mobTable->szName, csvTable.AsStringByIndex(col++), sizeof(mobTable->szName));
- //3. ̸ ־ֱ.
+ //3. 지역별 이름 넣어주기.
map::iterator it;
it = nameMap.find(mobTable->dwVnum);
if (it != nameMap.end()) {
@@ -749,11 +749,11 @@ bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::mapdwVnum = dataArray[0];
@@ -777,7 +777,7 @@ bool Set_Proto_Item_Table(TItemTable *itemTable, cCsvTable &csvTable,std::mapszName, csvTable.AsStringByIndex(1), sizeof(itemTable->szName));
- // ̸ ־ֱ.
+ //지역별 이름 넣어주기.
map::iterator it;
it = nameMap.find(itemTable->dwVnum);
if (it != nameMap.end()) {
diff --git a/src/db/src/ProtoReader.h b/src/db/src/ProtoReader.h
index 5505f73..260ccdb 100644
--- a/src/db/src/ProtoReader.h
+++ b/src/db/src/ProtoReader.h
@@ -6,8 +6,8 @@
#include "CsvReader.h"
-//csv оͼ ̺ ־ش.
-void putItemIntoTable(); //(̺, Ʈ)
+//csv 파일을 읽어와서 아이템 테이블에 넣어준다.
+void putItemIntoTable(); //(테이블, 테스트여부)
int get_Item_Type_Value(std::string inputString);
int get_Item_SubType_Value(int type_value, std::string inputString);
@@ -19,7 +19,7 @@ int get_Item_LimitType_Value(std::string inputString);
int get_Item_ApplyType_Value(std::string inputString);
-// 䵵 ִ.
+//몬스터 프로토도 읽을 수 있다.
int get_Mob_Rank_Value(std::string inputString);
int get_Mob_Type_Value(std::string inputString);
int get_Mob_BattleType_Value(std::string inputString);
diff --git a/src/db/src/QID.h b/src/db/src/QID.h
index 230d2ef..86ca086 100644
--- a/src/db/src/QID.h
+++ b/src/db/src/QID.h
@@ -2,7 +2,7 @@
#define __INC_METIN_II_DB_QID_H__
/**
- * @version 05/06/10 Bang2ni - ߰(QID_ITEMPRICE_XXX)
+ * @version 05/06/10 Bang2ni - 아이템 가격정보 쿼리 추가(QID_ITEMPRICE_XXX)
*/
enum QID
{
@@ -20,19 +20,18 @@ enum QID
QID_ITEM_DESTROY, // 11
QID_QUEST_SAVE, // 12
QID_PLAYER_SAVE, // 13
- QID_HIGHSCORE_REGISTER, // 14
- QID_PLAYER_DELETE, // 15
- QID_LOGIN_BY_KEY, // 16
- QID_PLAYER_INDEX_CREATE, // 17
- QID_ITEM_AWARD_LOAD, // 18
- QID_ITEM_AWARD_TAKEN, // 19
- QID_GUILD_RANKING, // 20
+ QID_PLAYER_DELETE, // 14
+ QID_LOGIN_BY_KEY, // 15
+ QID_PLAYER_INDEX_CREATE, // 16
+ QID_ITEM_AWARD_LOAD, // 17
+ QID_ITEM_AWARD_TAKEN, // 18
+ QID_GUILD_RANKING, // 19
// MYSHOP_PRICE_LIST
- QID_ITEMPRICE_SAVE, ///< 21,
- QID_ITEMPRICE_DESTROY, ///< 22,
- QID_ITEMPRICE_LOAD_FOR_UPDATE, ///< 23, Ʈ ε
- QID_ITEMPRICE_LOAD, ///< 24, ε
+ QID_ITEMPRICE_SAVE, ///< 20, 아이템 가격정보 저장 쿼리
+ QID_ITEMPRICE_DESTROY, ///< 21, 아이템 가격정보 삭제 쿼리
+ QID_ITEMPRICE_LOAD_FOR_UPDATE, ///< 22, 가격정보 업데이트를 위한 아이템 가격정보 로드 쿼리
+ QID_ITEMPRICE_LOAD, ///< 22, 아이템 가격정보 로드 쿼리
// END_OF_MYSHOP_PRICE_LIST
};
diff --git a/src/db/src/grid.cpp b/src/db/src/grid.cpp
index 1487055..922c4ba 100644
--- a/src/db/src/grid.cpp
+++ b/src/db/src/grid.cpp
@@ -28,7 +28,7 @@ void CGrid::Clear()
int CGrid::FindBlank(int w, int h)
{
- // ũⰡ ũٸ Ȯ ʿ ׳
+ // 크기가 더 크다면 확인할 필요 없이 그냥 리턴
if (w > m_iWidth || h > m_iHeight)
return -1;
@@ -86,7 +86,7 @@ bool CGrid::IsEmpty(int iPos, int w, int h)
{
int iRow = iPos / m_iWidth;
- // Grid ΰ ˻
+ // Grid 안쪽인가를 먼저 검사
if (iRow + h > m_iHeight)
return false;
diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt
index a9f7d76..776ec90 100644
--- a/src/game/CMakeLists.txt
+++ b/src/game/CMakeLists.txt
@@ -20,23 +20,23 @@ endif()
# Treat char variables as signed, especially useful for ARM builds
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
-# Find dependencies
+# Find and link dependencies
#
# vcpkg dependencies
#
-# MySQL
-find_package(unofficial-libmysql REQUIRED)
-target_link_libraries(${PROJECT_NAME} unofficial::libmysql::libmysql)
+# MariaDB
+find_package(unofficial-libmariadb REQUIRED)
+target_link_libraries(${PROJECT_NAME} unofficial::libmariadb)
+
+# Argon2
+find_package(unofficial-argon2 CONFIG REQUIRED)
+target_link_libraries(${PROJECT_NAME} unofficial::argon2::libargon2)
# Crypto++
find_package(cryptopp CONFIG REQUIRED)
-target_link_libraries (${PROJECT_NAME} cryptopp::cryptopp)
-
-# Boost
-find_package(Boost REQUIRED)
-target_link_libraries (${PROJECT_NAME} Boost::boost)
+target_link_libraries(${PROJECT_NAME} cryptopp::cryptopp)
# Libevent
find_package(Libevent CONFIG REQUIRED)
diff --git a/src/game/src/BattleArena.cpp b/src/game/src/BattleArena.cpp
index 397d0ed..2752239 100644
--- a/src/game/src/BattleArena.cpp
+++ b/src/game/src/BattleArena.cpp
@@ -102,14 +102,14 @@ EVENTFUNC(battle_arena_event)
case 0:
{
++pInfo->state;
- BroadcastNotice(LC_TEXT("͵ ݱ 5 ҽϴ!!!"));
+ BroadcastNotice(LC_TEXT("Five minutes until the monsters attack!!!"));
}
return test_server ? PASSES_PER_SEC(60) : PASSES_PER_SEC(60*4);
case 1:
{
++pInfo->state;
- BroadcastNotice(LC_TEXT("͵ ݱ 1 ҽϴ!!!"));
+ BroadcastNotice(LC_TEXT("One minute left until the monsters attack!!!"));
}
return test_server ? PASSES_PER_SEC(10) : PASSES_PER_SEC(60);
@@ -119,7 +119,7 @@ EVENTFUNC(battle_arena_event)
pInfo->wait_count = 0;
quest::CQuestManager::instance().RequestSetEventFlag("battle_arena", 0);
- BroadcastNotice(LC_TEXT("͵ ϱ ߽ϴ."));
+ BroadcastNotice(LC_TEXT("Monsters have started attacking your castle."));
LPSECTREE_MAP sectree = SECTREE_MANAGER::instance().GetMap(pInfo->nMapIndex);
@@ -141,7 +141,7 @@ EVENTFUNC(battle_arena_event)
if ( SECTREE_MANAGER::instance().GetMonsterCountInMap(pInfo->nMapIndex) <= 0 )
{
pInfo->state = 6;
- SendNoticeMap(LC_TEXT("߾ ܿ ϴ."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("Evil energy gathers at the center altar."), pInfo->nMapIndex, false);
}
else
{
@@ -150,7 +150,7 @@ EVENTFUNC(battle_arena_event)
if ( pInfo->wait_count >= 5 )
{
pInfo->state++;
- SendNoticeMap(LC_TEXT("͵ Դϴ."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("The monsters are showing signs of retreating."), pInfo->nMapIndex, false);
}
else
{
@@ -163,8 +163,8 @@ EVENTFUNC(battle_arena_event)
case 4 :
{
pInfo->state++;
- SendNoticeMap(LC_TEXT("͵ ߽ϴ."), pInfo->nMapIndex, false);
- SendNoticeMap(LC_TEXT(" ưϴ."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("The monsters began to retreat."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("After a while, you'll return to the village."), pInfo->nMapIndex, false);
SECTREE_MANAGER::instance().PurgeMonstersInMap(pInfo->nMapIndex);
}
@@ -189,8 +189,8 @@ EVENTFUNC(battle_arena_event)
pInfo->state++;
pInfo->wait_count = 0;
- SendNoticeMap(LC_TEXT("͵ Ÿϴ."), pInfo->nMapIndex, false);
- SendNoticeMap(LC_TEXT("30 ָ ּ."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("The monster boss has appeared."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("You have 30 minutes to defeat the boss."), pInfo->nMapIndex, false);
CBattleArena::instance().SpawnLastBoss();
}
@@ -200,8 +200,8 @@ EVENTFUNC(battle_arena_event)
{
if ( SECTREE_MANAGER::instance().GetMonsterCountInMap(pInfo->nMapIndex) <= 0 )
{
- SendNoticeMap(LC_TEXT("ֿ ϵ ƽϴ."), pInfo->nMapIndex, false);
- SendNoticeMap(LC_TEXT(" ưϴ."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("You have defeated the boss and all of his minions."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("After a while, you'll return to the village."), pInfo->nMapIndex, false);
pInfo->state = 5;
@@ -212,8 +212,8 @@ EVENTFUNC(battle_arena_event)
if ( pInfo->wait_count >= 6 )
{
- SendNoticeMap(LC_TEXT("ְ Ͽϴ."), pInfo->nMapIndex, false);
- SendNoticeMap(LC_TEXT(" ưϴ."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("The monsters have retreated."), pInfo->nMapIndex, false);
+ SendNoticeMap(LC_TEXT("After a while, you'll return to the village."), pInfo->nMapIndex, false);
SECTREE_MANAGER::instance().PurgeMonstersInMap(pInfo->nMapIndex);
SECTREE_MANAGER::instance().PurgeStonesInMap(pInfo->nMapIndex);
@@ -243,9 +243,9 @@ bool CBattleArena::Start(int nEmpire)
m_nEmpire = nEmpire;
char szBuf[1024];
- snprintf(szBuf, sizeof(szBuf), LC_TEXT("%s ͵ ϰ ֽϴ."), EMPIRE_NAME(m_nEmpire));
+ snprintf(szBuf, sizeof(szBuf), LC_TEXT("Monsters are marching on %s's castle."), EMPIRE_NAME(m_nEmpire));
BroadcastNotice(szBuf);
- BroadcastNotice(LC_TEXT("10 Դϴ."));
+ BroadcastNotice(LC_TEXT("We will attack the castle in 10 minutes."));
if (m_pEvent != NULL) {
event_cancel(&m_pEvent);
diff --git a/src/game/src/DragonLair.cpp b/src/game/src/DragonLair.cpp
index a847b8e..2769b1f 100644
--- a/src/game/src/DragonLair.cpp
+++ b/src/game/src/DragonLair.cpp
@@ -91,7 +91,7 @@ EVENTFUNC( DragonLair_Collapse_Event )
if (0 == pInfo->step)
{
char buf[512];
- snprintf(buf, 512, LC_TEXT("밡 %d ʸ ȿФ"), pInfo->pLair->GetEstimatedTime());
+ snprintf(buf, 512, LC_TEXT("Dragon died in %d seconds."), pInfo->pLair->GetEstimatedTime());
SendNoticeMap(buf, pInfo->InstanceMapIndex, true);
pInfo->step++;
@@ -146,7 +146,7 @@ DWORD CDragonLair::GetEstimatedTime() const
void CDragonLair::OnDragonDead(LPCHARACTER pDragon)
{
- SPDLOG_DEBUG("DragonLair: ȿ");
+ SPDLOG_DEBUG("DragonLair: Dragon is dead and stale");
LogManager::instance().DragonSlayLog( GuildID_, pDragon->GetMobTable().dwVnum, StartTime_, get_global_time() );
}
@@ -237,7 +237,7 @@ void CDragonLairManager::OnDragonDead(LPCHARACTER pDragon, DWORD KillerGuildID)
iter->second->OnDragonDead( pDragon );
- // ֵ ֱ
+ // 애들 다 집으로 보내고 맵 없애기
tag_DragonLair_Collapse_EventInfo* info;
info = AllocEventInfo();
diff --git a/src/game/src/DragonSoul.cpp b/src/game/src/DragonSoul.cpp
index 28eb300..21dfede 100644
--- a/src/game/src/DragonSoul.cpp
+++ b/src/game/src/DragonSoul.cpp
@@ -9,7 +9,6 @@
#include "dragon_soul_table.h"
#include "log.h"
#include "DragonSoul.h"
-#include
typedef std::vector TTokenVector;
@@ -31,7 +30,7 @@ int Gamble(std::vector& vec_probs)
return -1;
}
-// ġ ̺(prob_lst) random_set.size() index Ͽ random_set return
+// 가중치 테이블(prob_lst)을 받아 random_set.size()개의 index를 선택하여 random_set을 return
bool MakeDistinctRandomNumberSet(std::list prob_lst, OUT std::vector& random_set)
{
int size = prob_lst.size();
@@ -67,11 +66,11 @@ bool MakeDistinctRandomNumberSet(std::list prob_lst, OUT std::vectorGetApplyNumSettings(ds_type, grade_idx, basic_apply_num, add_min, add_max))
{
@@ -315,14 +314,14 @@ int DSManager::GetDuration(const LPITEM pItem) const
return pItem->GetDuration();
}
-// ȥ Ƽ ϴ Լ
+// 용혼석을 받아서 용심을 추출하는 함수
bool DSManager::ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtractor)
{
if (NULL == ch || NULL == pItem)
return false;
if (pItem->IsEquipped())
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ȥ ϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The Dragon Stone cannot be removed."));
return false;
}
@@ -366,7 +365,7 @@ bool DSManager::ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtract
}
LogManager::instance().ItemLog(ch, pItem, "DS_HEART_EXTRACT_FAIL", "");
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" Ͽϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Remaining duration extraction failed."));
return false;
}
else
@@ -389,15 +388,15 @@ bool DSManager::ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtract
pDH->SetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX, iCharge);
ch->AutoGiveItem(pDH, true);
- std::string s = boost::lexical_cast (iCharge);
+ std::string s = std::to_string(iCharge);
s += "%s";
LogManager::instance().ItemLog(ch, pItem, "DS_HEART_EXTRACT_SUCCESS", s.c_str());
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" Ͽϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Dragon Stone remaining duration has been extracted."));
return true;
}
}
-// Ư ȥ â θ ϰ, н λ깰 ִ Լ.
+// 특정 용혼석을 장비창에서 제거할 때에 성공 여부를 결정하고, 실패시 부산물을 주는 함수.
bool DSManager::PullOut(LPCHARACTER ch, TItemPos DestCell, LPITEM& pItem, LPITEM pExtractor)
{
if (NULL == ch || NULL == pItem)
@@ -406,13 +405,13 @@ bool DSManager::PullOut(LPCHARACTER ch, TItemPos DestCell, LPITEM& pItem, LPITEM
return false;
}
- // ǥ ġ valid ˻ , valid ʴٸ ã´.
+ // 목표 위치가 valid한지 검사 후, valid하지 않다면 임의의 빈 공간을 찾는다.
if (!IsValidCellForThisItem(pItem, DestCell))
{
int iEmptyCell = ch->GetEmptyDragonSoulInventory(pItem);
if (iEmptyCell < 0)
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ǰ ϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("There isn't enough space in your inventory."));
return false;
}
else
@@ -430,14 +429,14 @@ bool DSManager::PullOut(LPCHARACTER ch, TItemPos DestCell, LPITEM& pItem, LPITEM
int iBonus = 0;
float fProb;
float fDice;
- // ȥ .
+ // 용혼석 추출 성공 여부 결정.
{
DWORD dwVnum = pItem->GetVnum();
BYTE ds_type, grade_idx, step_idx, strength_idx;
GetDragonSoulInfo(pItem->GetVnum(), ds_type, grade_idx, step_idx, strength_idx);
- // ٸ ϴ ϴ ̶ .
+ // 추출 정보가 없다면 일단 무조건 성공하는 것이라 생각하자.
if (!m_pTable->GetDragonSoulExtValues(ds_type, grade_idx, fProb, dwByProduct))
{
pItem->AddToCharacter(ch, DestCell);
@@ -454,7 +453,7 @@ bool DSManager::PullOut(LPCHARACTER ch, TItemPos DestCell, LPITEM& pItem, LPITEM
bSuccess = fDice <= (fProb * (100 + iBonus) / 100.f);
}
- // ij ȥ ߰ Ȥ . λ깰 .
+ // 캐릭터의 용혼석 추출 및 추가 혹은 제거. 부산물 제공.
{
char buf[128];
@@ -469,7 +468,7 @@ bool DSManager::PullOut(LPCHARACTER ch, TItemPos DestCell, LPITEM& pItem, LPITEM
sprintf(buf, "dice(%d) prob(%d)", (int)fDice, (int)fProb);
}
LogManager::instance().ItemLog(ch, pItem, "DS_PULL_OUT_SUCCESS", buf);
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȥ Ͽϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Dragon Stone has been removed."));
pItem->AddToCharacter(ch, DestCell);
return true;
}
@@ -490,12 +489,12 @@ bool DSManager::PullOut(LPCHARACTER ch, TItemPos DestCell, LPITEM& pItem, LPITEM
{
LPITEM pByProduct = ch->AutoGiveItem(dwByProduct, true);
if (pByProduct)
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȥ Ͽ %s ϴ."), pByProduct->GetName());
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Removal of Dragon Stone failed. But you have received the following: %s"), pByProduct->GetName());
else
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȥ Ͽϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Removal of Dragon Stone failed."));
}
else
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȥ Ͽϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Removal of Dragon Stone failed."));
}
}
@@ -519,8 +518,8 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
return false;
}
- // Ȥó ߺǴ item pointer ֱ ؼ set
- // ̻ Ŷ , ߺ TItemPos ְ, ߸ TItemPos ִ.
+ // 혹시나 모를 중복되는 item pointer 없애기 위해서 set 사용
+ // 이상한 패킷을 보낼 경우, 중복된 TItemPos가 있을 수도 있고, 잘못된 TItemPos가 있을 수도 있다.
std::set set_items;
for (int i = 0; i < DRAGON_SOUL_REFINE_GRID_SIZE; i++)
{
@@ -529,10 +528,10 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
LPITEM pItem = ch->GetItem(aItemPoses[i]);
if (NULL != pItem)
{
- // ȥ ƴ â .
+ // 용혼석이 아닌 아이템이 개량창에 있을 수 없다.
if (!pItem->IsDragonSoul())
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ʿ ᰡ ƴմϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This item is not required for improving the clarity level."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell()));
return false;
@@ -557,7 +556,7 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
BYTE ds_type, grade_idx, step_idx, strength_idx;
int result_grade;
- // ó ȭ ´.
+ // 가장 처음 것을 강화의 기준으로 삼는다.
std::set ::iterator it = set_items.begin();
{
LPITEM pItem = *it;
@@ -566,7 +565,7 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
if (!m_pTable->GetRefineGradeValues(ds_type, grade_idx, need_count, fee, vec_probs))
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ȥԴϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This item cannot be advanced this way."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell()));
return false;
@@ -576,8 +575,8 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
{
LPITEM pItem = *it;
- // Ŭ ui â ø ұ ,
- // ˸ ó .
+ // 클라 ui에서 장착한 아이템은 개량창에 올릴 수 없도록 막았기 때문에,
+ // 별도의 알림 처리는 안함.
if (pItem->IsEquipped())
{
return false;
@@ -585,14 +584,14 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
if (ds_type != GetType(pItem->GetVnum()) || grade_idx != GetGradeIdx(pItem->GetVnum()))
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ʿ ᰡ ƴմϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This item is not required for improving the clarity level."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell()));
return false;
}
}
- // Ŭ ѹ üũ ϱ count != need_count invalid Ŭ ɼ ũ.
+ // 클라에서 한번 갯수 체크를 하기 때문에 count != need_count라면 invalid 클라일 가능성이 크다.
if (count != need_count)
{
SPDLOG_ERROR("Possiblity of invalid client. Name {}", ch->GetName());
@@ -603,7 +602,7 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
if (ch->GetGold() < fee)
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ϱ մϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You do not have enough Yang to use this item."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY, NPOS);
return false;
}
@@ -648,7 +647,7 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
char buf[128];
sprintf(buf, "GRADE : %d -> %d", grade_idx, result_grade);
LogManager::instance().ItemLog(ch, pResultItem, "DS_GRADE_REFINE_SUCCESS", buf);
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ߽ϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Refinement up one class was successful."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_SUCCEED, TItemPos (pResultItem->GetWindow(), pResultItem->GetCell()));
return true;
}
@@ -657,7 +656,7 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
char buf[128];
sprintf(buf, "GRADE : %d -> %d", grade_idx, result_grade);
LogManager::instance().ItemLog(ch, pResultItem, "DS_GRADE_REFINE_FAIL", buf);
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ߽ϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Refinement up one class failed."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL, TItemPos (pResultItem->GetWindow(), pResultItem->GetCell()));
return false;
}
@@ -679,18 +678,18 @@ bool DSManager::DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_
return false;
}
- // Ȥó ߺǴ item pointer ֱ ؼ set
- // ̻ Ŷ , ߺ TItemPos ְ, ߸ TItemPos ִ.
+ // 혹시나 모를 중복되는 item pointer 없애기 위해서 set 사용
+ // 이상한 패킷을 보낼 경우, 중복된 TItemPos가 있을 수도 있고, 잘못된 TItemPos가 있을 수도 있다.
std::set set_items;
for (int i = 0; i < DRAGON_SOUL_REFINE_GRID_SIZE; i++)
{
LPITEM pItem = ch->GetItem(aItemPoses[i]);
if (NULL != pItem)
{
- // ȥ ƴ â .
+ // 용혼석이 아닌 아이템이 개량창에 있을 수 없다.
if (!pItem->IsDragonSoul())
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ܰ ʿ ᰡ ƴմϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You do not own the materials required to strengthen the Dragon Stone."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell()));
return false;
}
@@ -713,7 +712,7 @@ bool DSManager::DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_
BYTE ds_type, grade_idx, step_idx, strength_idx;
int result_step;
- // ó ȭ ´.
+ // 가장 처음 것을 강화의 기준으로 삼는다.
std::set ::iterator it = set_items.begin();
{
LPITEM pItem = *it;
@@ -721,7 +720,7 @@ bool DSManager::DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_
if (!m_pTable->GetRefineStepValues(ds_type, step_idx, need_count, fee, vec_probs))
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ܰ ȥԴϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This item is not required for refinement."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell()));
return false;
}
@@ -730,21 +729,21 @@ bool DSManager::DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_
while(++it != set_items.end())
{
LPITEM pItem = *it;
- // Ŭ ui â ø ұ ,
- // ˸ ó .
+ // 클라 ui에서 장착한 아이템은 개량창에 올릴 수 없도록 막았기 때문에,
+ // 별도의 알림 처리는 안함.
if (pItem->IsEquipped())
{
return false;
}
if (ds_type != GetType(pItem->GetVnum()) || grade_idx != GetGradeIdx(pItem->GetVnum()) || step_idx != GetStepIdx(pItem->GetVnum()))
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ܰ ʿ ᰡ ƴմϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You do not own the materials required to strengthen the Dragon Stone."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell()));
return false;
}
}
- // Ŭ ѹ üũ ϱ count != need_count invalid Ŭ ɼ ũ.
+ // 클라에서 한번 갯수 체크를 하기 때문에 count != need_count라면 invalid 클라일 가능성이 크다.
if (count != need_count)
{
SPDLOG_ERROR("Possiblity of invalid client. Name {}", ch->GetName());
@@ -755,7 +754,7 @@ bool DSManager::DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_
if (ch->GetGold() < fee)
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ϱ մϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You do not have enough Yang to use this item."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY, NPOS);
return false;
}
@@ -800,7 +799,7 @@ bool DSManager::DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_
char buf[128];
sprintf(buf, "STEP : %d -> %d", step_idx, result_step);
LogManager::instance().ItemLog(ch, pResultItem, "DS_STEP_REFINE_SUCCESS", buf);
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ܰ ߽ϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Improvement of the clarity level successful."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_SUCCEED, TItemPos (pResultItem->GetWindow(), pResultItem->GetCell()));
return true;
}
@@ -809,7 +808,7 @@ bool DSManager::DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_
char buf[128];
sprintf(buf, "STEP : %d -> %d", step_idx, result_step);
LogManager::instance().ItemLog(ch, pResultItem, "DS_STEP_REFINE_FAIL", buf);
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ܰ ߽ϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Improvement of the clarity level failed."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL, TItemPos (pResultItem->GetWindow(), pResultItem->GetCell()));
return false;
}
@@ -840,8 +839,8 @@ bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_S
return false;
}
- // Ȥó ߺǴ item pointer ֱ ؼ set
- // ̻ Ŷ , ߺ TItemPos ְ, ߸ TItemPos ִ.
+ // 혹시나 모를 중복되는 item pointer 없애기 위해서 set 사용
+ // 이상한 패킷을 보낼 경우, 중복된 TItemPos가 있을 수도 있고, 잘못된 TItemPos가 있을 수도 있다.
std::set set_items;
for (int i = 0; i < DRAGON_SOUL_REFINE_GRID_SIZE; i++)
{
@@ -863,15 +862,15 @@ bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_S
for (std::set ::iterator it = set_items.begin(); it != set_items.end(); it++)
{
LPITEM pItem = *it;
- // Ŭ ui â ø ұ ,
- // ˸ ó .
+ // 클라 ui에서 장착한 아이템은 개량창에 올릴 수 없도록 막았기 때문에,
+ // 별도의 알림 처리는 안함.
if (pItem->IsEquipped())
{
return false;
}
- // ȥ ȭ â ִ.
- // ϳ ־Ѵ.
+ // 용혼석과 강화석만이 개량창에 있을 수 있다.
+ // 그리고 하나씩만 있어야한다.
if (pItem->IsDragonSoul())
{
if (pDragonSoul != NULL)
@@ -892,7 +891,7 @@ bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_S
}
else
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȭ ʿ ᰡ ƴմϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This item is not required for improving the clarity level."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pItem->GetWindow(), pItem->GetCell()));
return false;
}
@@ -912,17 +911,17 @@ bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_S
GetDragonSoulInfo(pDragonSoul->GetVnum(), bType, bGrade, bStep, bStrength);
float fWeight = 0.f;
- // ġ ٸ ȭ ȥ
+ // 가중치 값이 없다면 강화할 수 없는 용혼석
if (!m_pTable->GetWeight(bType, bGrade, bStep, bStrength + 1, fWeight))
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȭ ȥԴϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This Dragon Stone cannot be used for strengthening."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE, TItemPos(pDragonSoul->GetWindow(), pDragonSoul->GetCell()));
return false;
}
- // ȭ ġ 0̶ ̻ ȭǼ ȵȴ.
+ // 강화했을 때 가중치가 0이라면 더 이상 강화되서는 안된다.
if (fWeight < FLT_EPSILON)
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȭ ȥԴϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This Dragon Stone cannot be used for strengthening."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE, TItemPos(pDragonSoul->GetWindow(), pDragonSoul->GetCell()));
return false;
}
@@ -931,7 +930,7 @@ bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_S
float fProb;
if (!m_pTable->GetRefineStrengthValues(bType, pRefineStone->GetSubType(), bStrength, fee, fProb))
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȭ ȥԴϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("This Dragon Stone cannot be used for strengthening."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL, TItemPos(pDragonSoul->GetWindow(), pDragonSoul->GetCell()));
return false;
@@ -939,7 +938,7 @@ bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_S
if (ch->GetGold() < fee)
{
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ϱ մϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You do not have enough Yang to use this item."));
SendRefineResultPacket(ch, DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY, NPOS);
return false;
}
@@ -967,7 +966,7 @@ bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_S
char buf[128];
sprintf(buf, "STRENGTH : %d -> %d", bStrength, bStrength + 1);
LogManager::instance().ItemLog(ch, pDragonSoul, "DS_STRENGTH_REFINE_SUCCESS", buf);
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȭ ߽ϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Strengthening was successful."));
ch->AutoGiveItem(pResult, true);
bSubHeader = DS_SUB_HEADER_REFINE_SUCCEED;
}
@@ -988,10 +987,10 @@ bool DSManager::DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_S
char buf[128];
sprintf(buf, "STRENGTH : %d -> %d", bStrength, bStrength - 1);
- // strengthȭ н ־, α .
+ // strength강화는 실패시 깨질 수도 있어, 원본 아이템을 바탕으로 로그를 남김.
LogManager::instance().ItemLog(ch, pDragonSoul, "DS_STRENGTH_REFINE_FAIL", buf);
- ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ȭ ߽ϴ."));
+ ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Strengthening failed."));
pDragonSoul->SetCount(pDragonSoul->GetCount() - 1);
pRefineStone->SetCount(pRefineStone->GetCount() - 1);
if (NULL != pResult)
@@ -1029,12 +1028,12 @@ int DSManager::LeftTime(LPITEM pItem) const
if (pItem == NULL)
return false;
- // ϴ timer based on wear ȥ ð Ǿ .
+ // 일단은 timer based on wear인 용혼석만 시간 다 되어도 안 없어진다.
if (pItem->GetProto()->cLimitTimerBasedOnWearIndex >= 0)
{
return pItem->GetSocket(ITEM_SOCKET_REMAIN_SEC);
}
- // ٸ limit type ȥ ð Ǹ ϴ ð Ҵٰ Ǵ.
+ // 다른 limit type인 용혼석들은 시간 되면 모두 사라지기 때문에 여기 들어온 아이템은 일단 시간이 남았다고 판단.
else
{
return INT_MAX;
@@ -1046,12 +1045,12 @@ bool DSManager::IsTimeLeftDragonSoul(LPITEM pItem) const
if (pItem == NULL)
return false;
- // ϴ timer based on wear ȥ ð Ǿ .
+ // 일단은 timer based on wear인 용혼석만 시간 다 되어도 안 없어진다.
if (pItem->GetProto()->cLimitTimerBasedOnWearIndex >= 0)
{
return pItem->GetSocket(ITEM_SOCKET_REMAIN_SEC) > 0;
}
- // ٸ limit type ȥ ð Ǹ ϴ ð Ҵٰ Ǵ.
+ // 다른 limit type인 용혼석들은 시간 되면 모두 사라지기 때문에 여기 들어온 아이템은 일단 시간이 남았다고 판단.
else
{
return true;
diff --git a/src/game/src/DragonSoul.h b/src/game/src/DragonSoul.h
index b7e5e35..44db655 100644
--- a/src/game/src/DragonSoul.h
+++ b/src/game/src/DragonSoul.h
@@ -16,23 +16,23 @@ public:
bool ReadDragonSoulTableFile(const char * c_pszFileName);
void GetDragonSoulInfo(DWORD dwVnum, OUT BYTE& bType, OUT BYTE& bGrade, OUT BYTE& bStep, OUT BYTE& bRefine) const;
- // fixme : titempos
+ // fixme : titempos로
WORD GetBasePosition(const LPITEM pItem) const;
bool IsValidCellForThisItem(const LPITEM pItem, const TItemPos& Cell) const;
int GetDuration(const LPITEM pItem) const;
- // ȥ Ƽ Ư ϴ Լ
+ // 용혼석을 받아서 특정 용심을 추출하는 함수
bool ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtractor = NULL);
- // Ư ȥ(pItem) â θ ϰ,
- // н λ깰 ִ Լ.(λ깰 dragon_soul_table.txt )
- // DestCell invalid , ȥ ڵ ߰.
- // , ȥ(pItem) delete.
- // ִٸ Ȯ pExtractor->GetValue(0)%ŭ .
- // λ깰 ڵ ߰.
+ // 특정 용혼석(pItem)을 장비창에서 제거할 때에 성공 여부를 결정하고,
+ // 실패시 부산물을 주는 함수.(부산물은 dragon_soul_table.txt에 정의)
+ // DestCell에 invalid한 값을 넣으면 성공 시, 용혼석을 빈 공간에 자동 추가.
+ // 실패 시, 용혼석(pItem)은 delete됨.
+ // 추출아이템이 있다면 추출 성공 확률이 pExtractor->GetValue(0)%만큼 증가함.
+ // 부산물은 언제나 자동 추가.
bool PullOut(LPCHARACTER ch, TItemPos DestCell, IN OUT LPITEM& pItem, LPITEM pExtractor = NULL);
- // ȥ ̵ Լ
+ // 용혼석 업그레이드 함수
bool DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]);
bool DoRefineStep(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]);
bool DoRefineStrength(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL_REFINE_GRID_SIZE]);
@@ -47,7 +47,7 @@ public:
private:
void SendRefineResultPacket(LPCHARACTER ch, BYTE bSubHeader, const TItemPos& pos);
- // ij ȥ 캸, Ȱȭ ȥ ٸ, ij ȥ Ȱ ¸ off Ű Լ.
+ // 캐릭터의 용혼석 덱을 살펴보고, 활성화 된 용혼석이 없다면, 캐릭터의 용혼석 활성 상태를 off 시키는 함수.
void RefreshDragonSoulState(LPCHARACTER ch);
DWORD MakeDragonSoulVnum(BYTE bType, BYTE grade, BYTE step, BYTE refine);
diff --git a/src/game/src/IFileMonitor.h b/src/game/src/IFileMonitor.h
index 808919e..4fa0218 100644
--- a/src/game/src/IFileMonitor.h
+++ b/src/game/src/IFileMonitor.h
@@ -1,7 +1,6 @@
#ifndef IFILEMONITOR_INCLUDED
#define IFILEMONITOR_INCLUDED
-//#include
#include
enum eFileUpdatedOptions
diff --git a/src/game/src/MarkConvert.cpp b/src/game/src/MarkConvert.cpp
index 3ac11b0..06473b8 100644
--- a/src/game/src/MarkConvert.cpp
+++ b/src/game/src/MarkConvert.cpp
@@ -30,14 +30,14 @@ static Pixel * LoadOldGuildMarkImageFile()
bool GuildMarkConvert(const std::vector & vecGuildID)
{
- //
+ // 폴더 생성
#ifndef __WIN32__
mkdir("mark", S_IRWXU);
#else
_mkdir("mark");
#endif
- // ε ֳ?
+ // 인덱스 파일이 있나?
#ifndef __WIN32__
if (0 != access(OLD_MARK_INDEX_FILENAME, F_OK))
#else
@@ -45,13 +45,13 @@ bool GuildMarkConvert(const std::vector & vecGuildID)
#endif
return true;
- // ε
+ // 인덱스 파일 열기
FILE* fp = fopen(OLD_MARK_INDEX_FILENAME, "r");
if (NULL == fp)
return false;
- // ̹
+ // 이미지 파일 열기
Pixel * oldImagePtr = LoadOldGuildMarkImageFile();
if (NULL == oldImagePtr)
@@ -61,8 +61,8 @@ bool GuildMarkConvert(const std::vector & vecGuildID)
}
/*
- // guild_mark.tga targa ƴϰ, 512 * 512 * 4 ũ raw ̴.
- // Ȯϱ targa Ϸ .
+ // guild_mark.tga가 실제 targa 파일이 아니고, 512 * 512 * 4 크기의 raw 파일이다.
+ // 눈으로 확인하기 위해 실제 targa 파일로 만든다.
CGuildMarkImage * pkImage = new CGuildMarkImage;
pkImage->Build("guild_mark_real.tga");
pkImage->Load("guild_mark_real.tga");
@@ -86,7 +86,7 @@ bool GuildMarkConvert(const std::vector