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..3fdf6d2 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__
@@ -28,14 +26,13 @@ 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 +67,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 +82,6 @@ int main()
GuildManager.Initialize();
MarriageManager.Initialize();
- BlockCountry.Load();
ItemIDRangeManager.Build();
#ifdef __AUCTION__
AuctionManager::instance().Initialize();
@@ -122,13 +116,13 @@ 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()
{
@@ -170,27 +164,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");
@@ -324,35 +299,6 @@ int Start()
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);
- }
- while (iRetry--);
-
- SPDLOG_INFO("Success HOTBACKUP");
- }
- else
- {
- SPDLOG_ERROR("SQL_HOTBACKUP not configured");
- return false;
- }
-
if (!CClientManager::instance().Initialize())
{
SPDLOG_ERROR("ClientManager initialization failed");
@@ -361,12 +307,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
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/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..6d3a249 100644
--- a/src/game/src/DragonSoul.cpp
+++ b/src/game/src/DragonSoul.cpp
@@ -31,7 +31,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 +67,11 @@ bool MakeDistinctRandomNumberSet(std::list prob_lst, OUT std::vectorGetApplyNumSettings(ds_type, grade_idx, basic_apply_num, add_min, add_max))
{
@@ -315,14 +315,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 +366,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
@@ -392,12 +392,12 @@ bool DSManager::ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtract
std::string s = boost::lexical_cast (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 +406,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 +430,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 +454,7 @@ bool DSManager::PullOut(LPCHARACTER ch, TItemPos DestCell, LPITEM& pItem, LPITEM
bSuccess = fDice <= (fProb * (100 + iBonus) / 100.f);
}
- // ij ȥ ߰ Ȥ . λ깰 .
+ // 캐릭터의 용혼석 추출 및 추가 혹은 제거. 부산물 제공.
{
char buf[128];
@@ -469,7 +469,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 +490,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 +519,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 +529,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 +557,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 +566,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 +576,8 @@ bool DSManager::DoRefineGrade(LPCHARACTER ch, TItemPos (&aItemPoses)[DRAGON_SOUL
{
LPITEM pItem = *it;
- // Ŭ ui â ø ұ ,
- // ˸ ó .
+ // 클라 ui에서 장착한 아이템은 개량창에 올릴 수 없도록 막았기 때문에,
+ // 별도의 알림 처리는 안함.
if (pItem->IsEquipped())
{
return false;
@@ -585,14 +585,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 +603,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 +648,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 +657,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 +679,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 +713,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 +721,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 +730,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 +755,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 +800,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 +809,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 +840,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 +863,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 +892,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 +912,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 +931,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 +939,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 +967,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 +988,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 +1029,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 +1046,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/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 & vecGuildID)
continue;
}
- // mark id -> ̹ ġ ã
+ // mark id -> 이미지에서의 위치 찾기
uint row = mark_id / 32;
uint col = mark_id % 32;
@@ -102,7 +102,7 @@ bool GuildMarkConvert(const std::vector & vecGuildID)
Pixel * src = oldImagePtr + sy * 512 + sx;
Pixel * dst = mark;
- // ̹ ũ Ѱ
+ // 옛날 이미지에서 마크 한개 복사
for (int y = 0; y != SGuildMark::HEIGHT; ++y)
{
for (int x = 0; x != SGuildMark::WIDTH; ++x)
@@ -111,7 +111,7 @@ bool GuildMarkConvert(const std::vector & vecGuildID)
src += 512;
}
- // ũ ýۿ ִ´.
+ // 새 길드 마크 시스템에 넣는다.
CGuildMarkManager::instance().SaveMark(guild_id, (BYTE *) mark);
line[0] = '\0';
}
@@ -119,7 +119,7 @@ bool GuildMarkConvert(const std::vector & vecGuildID)
free(oldImagePtr);
fclose(fp);
- // Ʈ ѹ ϸǹǷ Űش.
+ // 컨버트는 한번만 하면되므로 파일을 옮겨준다.
#ifndef __WIN32__
system("mv -f guild_mark.idx guild_mark.idx.removable");
system("mv -f guild_mark.tga guild_mark.tga.removable");
diff --git a/src/game/src/MarkImage.cpp b/src/game/src/MarkImage.cpp
index fe493c6..0b53e97 100644
--- a/src/game/src/MarkImage.cpp
+++ b/src/game/src/MarkImage.cpp
@@ -129,10 +129,10 @@ void CGuildMarkImage::GetData(UINT x, UINT y, UINT width, UINT height, void * da
ilCopyPixels(x, y, 0, width, height, 1, IL_BGRA, IL_UNSIGNED_BYTE, data);
}
-// ̹ = 512x512
-// = ũ 4 x 4
-// ũ = 16 x 12
-// ̹ = 8 x 10
+// 이미지 = 512x512
+// 블럭 = 마크 4 x 4
+// 마크 = 16 x 12
+// 한 이미지의 블럭 = 8 x 10
// SERVER
bool CGuildMarkImage::SaveMark(DWORD posMark, BYTE * pbImage)
@@ -143,14 +143,14 @@ bool CGuildMarkImage::SaveMark(DWORD posMark, BYTE * pbImage)
return false;
}
- // ũ ü ̹ .
+ // 마크를 전체 이미지에 그린다.
DWORD colMark = posMark % MARK_COL_COUNT;
DWORD rowMark = posMark / MARK_COL_COUNT;
printf("PutMark pos %u %ux%u\n", posMark, colMark * SGuildMark::WIDTH, rowMark * SGuildMark::HEIGHT);
PutData(colMark * SGuildMark::WIDTH, rowMark * SGuildMark::HEIGHT, SGuildMark::WIDTH, SGuildMark::HEIGHT, pbImage);
- // Ʈ
+ // 그려진 곳의 블럭을 업데이트
DWORD rowBlock = rowMark / SGuildMarkBlock::MARK_PER_BLOCK_HEIGHT;
DWORD colBlock = colMark / SGuildMarkBlock::MARK_PER_BLOCK_WIDTH;
@@ -197,7 +197,7 @@ bool CGuildMarkImage::SaveBlockFromCompressedData(DWORD posBlock, const BYTE * p
return true;
}
-void CGuildMarkImage::BuildAllBlocks() // ̹ ü ȭ
+void CGuildMarkImage::BuildAllBlocks() // 이미지 전체를 블럭화
{
Pixel apxBuf[SGuildMarkBlock::SIZE];
SPDLOG_INFO("GuildMarkImage::BuildAllBlocks");
diff --git a/src/game/src/MarkImage.h b/src/game/src/MarkImage.h
index c12b591..bb32da6 100644
--- a/src/game/src/MarkImage.h
+++ b/src/game/src/MarkImage.h
@@ -16,7 +16,7 @@ struct SGuildMark
};
///////////////////////////////////////////////////////////////////////////////
- Pixel m_apxBuf[SIZE]; // ̹
+ Pixel m_apxBuf[SIZE]; // 실제 이미지
///////////////////////////////////////////////////////////////////////////////
void Clear();
@@ -38,11 +38,11 @@ struct SGuildMarkBlock
};
///////////////////////////////////////////////////////////////////////////////
- Pixel m_apxBuf[SIZE]; // ̹
+ Pixel m_apxBuf[SIZE]; // 실제 이미지
- BYTE m_abCompBuf[MAX_COMP_SIZE]; //
- lzo_uint m_sizeCompBuf; // ũ
- DWORD m_crc; // CRC
+ BYTE m_abCompBuf[MAX_COMP_SIZE]; // 압축된 데이터
+ lzo_uint m_sizeCompBuf; // 압축된 크기
+ DWORD m_crc; // 압축된 데이터의 CRC
///////////////////////////////////////////////////////////////////////////////
DWORD GetCRC() const;
@@ -87,9 +87,9 @@ class CGuildMarkImage
bool SaveMark(DWORD posMark, BYTE * pbMarkImage);
bool DeleteMark(DWORD posMark);
- bool SaveBlockFromCompressedData(DWORD posBlock, const BYTE * pbComp, DWORD dwCompSize); // -> Ŭ̾Ʈ
+ bool SaveBlockFromCompressedData(DWORD posBlock, const BYTE * pbComp, DWORD dwCompSize); // 서버 -> 클라이언트
- DWORD GetEmptyPosition(); // ũ ġ ´.
+ DWORD GetEmptyPosition(); // 빈 마크 위치를 얻는다.
void GetBlockCRCList(DWORD * crcList);
void GetDiffBlocks(const DWORD * crcList, std::map & mapDiffBlocks);
diff --git a/src/game/src/MarkManager.cpp b/src/game/src/MarkManager.cpp
index 70b9088..3faa160 100644
--- a/src/game/src/MarkManager.cpp
+++ b/src/game/src/MarkManager.cpp
@@ -15,7 +15,7 @@ void CGuildMarkManager::__DeleteImage(CGuildMarkImage * pkImgDel)
CGuildMarkManager::CGuildMarkManager()
{
- // mark id . ()
+ // 남은 mark id 셋을 만든다. (서버용)
for (DWORD i = 0; i < MAX_IMAGE_COUNT * CGuildMarkImage::MARK_TOTAL_COUNT; ++i)
m_setFreeMarkID.insert(i);
}
@@ -44,7 +44,7 @@ void CGuildMarkManager::SetMarkPathPrefix(const char * prefix)
m_pathPrefix = prefix;
}
-// ũ ε ҷ ( )
+// 마크 인덱스 불러오기 (서버에서만 사용)
bool CGuildMarkManager::LoadMarkIndex()
{
char buf[64];
@@ -177,7 +177,7 @@ DWORD CGuildMarkManager::__AllocMarkID(DWORD guildID)
DWORD markID = *it;
DWORD imgIdx = markID / CGuildMarkImage::MARK_TOTAL_COUNT;
- CGuildMarkImage * pkImage = __GetImage(imgIdx); // ̹ ٸ
+ CGuildMarkImage * pkImage = __GetImage(imgIdx); // 이미지가 없다면 만들기 위해
if (pkImage && AddMarkIDByGuildID(guildID, markID))
return markID;
@@ -263,7 +263,7 @@ void CGuildMarkManager::GetDiffBlocks(DWORD imgIdx, const DWORD * crcList, std::
{
mapDiffBlocks.clear();
- // Ŭ̾Ʈ ̹ û .
+ // 클라이언트에서 서버에 없는 이미지를 요청할 수는 없다.
if (m_mapIdx_Image.end() == m_mapIdx_Image.find(imgIdx))
{
SPDLOG_ERROR("invalid idx {}", imgIdx);
@@ -290,7 +290,7 @@ bool CGuildMarkManager::SaveBlockFromCompressedData(DWORD imgIdx, DWORD posBlock
// CLIENT
bool CGuildMarkManager::GetBlockCRCList(DWORD imgIdx, DWORD * crcList)
{
- // Ŭ̾Ʈ ̹ û .
+ // 클라이언트에서 서버에 없는 이미지를 요청할 수는 없다.
if (m_mapIdx_Image.end() == m_mapIdx_Image.find(imgIdx))
{
SPDLOG_ERROR("invalid idx {}", imgIdx);
diff --git a/src/game/src/MarkManager.h b/src/game/src/MarkManager.h
index f8fa142..90df057 100644
--- a/src/game/src/MarkManager.h
+++ b/src/game/src/MarkManager.h
@@ -32,11 +32,11 @@ class CGuildMarkManager : public singleton
//
void SetMarkPathPrefix(const char * prefix);
- bool LoadMarkIndex(); // ũ ε ҷ ( )
- bool SaveMarkIndex(); // ũ ε ϱ
+ bool LoadMarkIndex(); // 마크 인덱스 불러오기 (서버에서만 사용)
+ bool SaveMarkIndex(); // 마크 인덱스 저장하기
- void LoadMarkImages(); // ũ ̹ ҷ
- void SaveMarkImage(DWORD imgIdx); // ũ ̹
+ void LoadMarkImages(); // 모든 마크 이미지를 불러오기
+ void SaveMarkImage(DWORD imgIdx); // 마크 이미지 저장
bool GetMarkImageFilename(DWORD imgIdx, std::string & path) const;
bool AddMarkIDByGuildID(DWORD guildID, DWORD markID);
diff --git a/src/game/src/OXEvent.cpp b/src/game/src/OXEvent.cpp
index 3e0bf8c..2156afb 100644
--- a/src/game/src/OXEvent.cpp
+++ b/src/game/src/OXEvent.cpp
@@ -155,11 +155,11 @@ bool COXEventManager::ShowQuizList(LPCHARACTER pkChar)
{
for (size_t j = 0; j < m_vec_quiz[i].size(); ++j, ++c)
{
- pkChar->ChatPacket(CHAT_TYPE_INFO, "%d %s %s", m_vec_quiz[i][j].level, m_vec_quiz[i][j].Quiz, m_vec_quiz[i][j].answer ? LC_TEXT("") : LC_TEXT(""));
+ pkChar->ChatPacket(CHAT_TYPE_INFO, "%d %s %s", m_vec_quiz[i][j].level, m_vec_quiz[i][j].Quiz, m_vec_quiz[i][j].answer ? LC_TEXT("TRUE") : LC_TEXT("FALSE"));
}
}
- pkChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" : %d"), c);
+ pkChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Total number of the Quiz: %d"), c);
return true;
}
@@ -197,32 +197,25 @@ EVENTFUNC(oxevent_timer)
switch (flag)
{
case 0:
- SendNoticeMap(LC_TEXT("10ʵ ϰڽϴ."), OXEVENT_MAP_INDEX, true);
+ SendNoticeMap(LC_TEXT("The result will follow in 10 seconds."), OXEVENT_MAP_INDEX, true);
flag++;
return PASSES_PER_SEC(10);
case 1:
- SendNoticeMap(LC_TEXT(""), OXEVENT_MAP_INDEX, true);
+ SendNoticeMap(LC_TEXT("The correct answer is:"), OXEVENT_MAP_INDEX, true);
if (info->answer == true)
{
COXEventManager::instance().CheckAnswer(true);
- SendNoticeMap(LC_TEXT("O Դϴ"), OXEVENT_MAP_INDEX, true);
+ SendNoticeMap(LC_TEXT("Yes (O)"), OXEVENT_MAP_INDEX, true);
}
else
{
COXEventManager::instance().CheckAnswer(false);
- SendNoticeMap(LC_TEXT("X Դϴ"), OXEVENT_MAP_INDEX, true);
+ SendNoticeMap(LC_TEXT("No (X)"), OXEVENT_MAP_INDEX, true);
}
- if (LC_IsJapan())
- {
- SendNoticeMap("??????X??O??????????B", OXEVENT_MAP_INDEX, true);
- }
- else
- {
- SendNoticeMap(LC_TEXT("5 Ʋ е ٱ ̵ Űڽϴ."), OXEVENT_MAP_INDEX, true);
- }
+ SendNoticeMap(LC_TEXT("In 5 sec. everyone who gave an incorrect answer will be removed."), OXEVENT_MAP_INDEX, true);
flag++;
return PASSES_PER_SEC(5);
@@ -230,7 +223,7 @@ EVENTFUNC(oxevent_timer)
case 2:
COXEventManager::instance().WarpToAudience();
COXEventManager::instance().SetStatus(OXEVENT_CLOSE);
- SendNoticeMap(LC_TEXT(" غּ."), OXEVENT_MAP_INDEX, true);
+ SendNoticeMap(LC_TEXT("Ready for the next question?"), OXEVENT_MAP_INDEX, true);
flag = 0;
break;
}
@@ -247,9 +240,9 @@ bool COXEventManager::Quiz(unsigned char level, int timelimit)
int idx = Random::get(0, m_vec_quiz[level].size() - 1);
- SendNoticeMap(LC_TEXT(" Դϴ."), OXEVENT_MAP_INDEX, true);
+ SendNoticeMap(LC_TEXT("OX-Question: "), OXEVENT_MAP_INDEX, true);
SendNoticeMap(m_vec_quiz[level][idx].Quiz, OXEVENT_MAP_INDEX, true);
- SendNoticeMap(LC_TEXT(" O, Ʋ X ̵ּ"), OXEVENT_MAP_INDEX, true);
+ SendNoticeMap(LC_TEXT("If it's correct, then go to O. If it's wrong, go to X."), OXEVENT_MAP_INDEX, true);
if (m_timedEvent != NULL) {
event_cancel(&m_timedEvent);
@@ -312,17 +305,17 @@ bool COXEventManager::CheckAnswer(bool answer)
}
else
{
- pkChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Դϴ!"));
+ pkChar->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Correct!"));
// pkChar->CreateFly(Random::get(FLY_FIREWORK1, FLY_FIREWORK6), pkChar);
char chatbuf[256];
int len = snprintf(chatbuf, sizeof(chatbuf),
"%s %u %u", Random::get(0, 1) == 1 ? "cheer1" : "cheer2", (DWORD)pkChar->GetVID(), 0);
- // ϰ sizeof(chatbuf) ̻ truncateǾٴ ..
+ // 리턴값이 sizeof(chatbuf) 이상일 경우 truncate되었다는 뜻..
if (len < 0 || len >= (int) sizeof(chatbuf))
len = sizeof(chatbuf) - 1;
- // \0
+ // \0 문자 포함
++len;
TPacketGCChat pack_chat;
diff --git a/src/game/src/OXEvent.h b/src/game/src/OXEvent.h
index c6d716e..a23b28f 100644
--- a/src/game/src/OXEvent.h
+++ b/src/game/src/OXEvent.h
@@ -10,10 +10,10 @@ struct tag_Quiz
enum OXEventStatus
{
- OXEVENT_FINISH = 0, // OX̺Ʈ
- OXEVENT_OPEN = 1, // OX̺Ʈ ۵. (20012) ؼ 尡
- OXEVENT_CLOSE = 2, // OX̺Ʈ . (20012) ܵ
- OXEVENT_QUIZ = 3, // .
+ OXEVENT_FINISH = 0, // OX이벤트가 완전히 끝난 상태
+ OXEVENT_OPEN = 1, // OX이벤트가 시작됨. 을두지(20012)를 통해서 입장가능
+ OXEVENT_CLOSE = 2, // OX이벤트의 참가가 끝남. 을두지(20012)를 통한 입장이 차단됨
+ OXEVENT_QUIZ = 3, // 퀴즈를 출제함.
OXEVENT_ERR = 0xff
};
diff --git a/src/game/src/PetSystem.cpp b/src/game/src/PetSystem.cpp
index f801850..278eaa5 100644
--- a/src/game/src/PetSystem.cpp
+++ b/src/game/src/PetSystem.cpp
@@ -18,13 +18,13 @@ EVENTINFO(petsystem_event_info)
CPetSystem* pPetSystem;
};
-// PetSystem update ִ event.
-// PetSystem CHRACTER_MANAGER FSM update ִ chracters ,
-// Owner STATE update _UpdateFollowAI Լ update ش.
-// owner state update CHRACTER_MANAGER ֱ ,
-// petsystem updateϴٰ pet unsummonϴ κп .
-// (CHRACTER_MANAGER update ϸ chracter destroy pendingǾ, CPetSystem dangling ְ ȴ.)
-// PetSystem Ʈ ִ event Ŵ.
+// PetSystem을 update 해주는 event.
+// PetSystem은 CHRACTER_MANAGER에서 기존 FSM으로 update 해주는 기존 chracters와 달리,
+// Owner의 STATE를 update 할 때 _UpdateFollowAI 함수로 update 해준다.
+// 그런데 owner의 state를 update를 CHRACTER_MANAGER에서 해주기 때문에,
+// petsystem을 update하다가 pet을 unsummon하는 부분에서 문제가 생겼다.
+// (CHRACTER_MANAGER에서 update 하면 chracter destroy가 pending되어, CPetSystem에서는 dangling 포인터를 가지고 있게 된다.)
+// 따라서 PetSystem만 업데이트 해주는 event를 발생시킴.
EVENTFUNC(petsystem_update_event)
{
petsystem_event_info* info = dynamic_cast( event->info );
@@ -41,12 +41,12 @@ EVENTFUNC(petsystem_update_event)
pPetSystem->Update(0);
- // 0.25ʸ .
+ // 0.25초마다 갱신.
return PASSES_PER_SEC(1) / 4;
}
-/// NOTE: 1ijͰ ִ ... ij ٸ ҰŶ ֵ... ..
-/// ִ ÿ ȯ ִ Ʋ ִµ ̷ ȹ ϴ
+/// NOTE: 1캐릭터가 몇개의 펫을 가질 수 있는지 제한... 캐릭터마다 개수를 다르게 할거라면 변수로 넣등가... 음..
+/// 가질 수 있는 개수와 동시에 소환할 수 있는 개수가 틀릴 수 있는데 이런건 기획 없으니 일단 무시
const float PET_COUNT_LIMIT = 3;
///////////////////////////////////////////////////////////////////////////////////////
@@ -119,7 +119,7 @@ void CPetActor::Unsummon()
{
if (true == this->IsSummoned())
{
- //
+ // 버프 삭제
this->ClearBuff();
this->SetSummonItem(NULL);
if (NULL != m_pkOwner)
@@ -175,14 +175,14 @@ DWORD CPetActor::Summon(const char* petName, LPITEM pSummonItem, bool bSpawnFar)
// m_pkOwner->DetailLog();
// m_pkChar->DetailLog();
- // .
+ //펫의 국가를 주인의 국가로 설정함.
m_pkChar->SetEmpire(m_pkOwner->GetEmpire());
m_dwVID = m_pkChar->GetVID();
this->SetName(petName);
- // SetSummonItem(pSummonItem) θ Ŀ ComputePoints θ .
+ // SetSummonItem(pSummonItem)를 부른 후에 ComputePoints를 부르면 버프 적용됨.
this->SetSummonItem(pSummonItem);
m_pkOwner->ComputePoints();
m_pkChar->Show(m_pkOwner->GetMapIndex(), x, y, z);
@@ -197,11 +197,11 @@ bool CPetActor::_UpdatAloneActionAI(float fMinDist, float fMaxDist)
float dest_x = GetOwner()->GetX() + fDist * cos(r);
float dest_y = GetOwner()->GetY() + fDist * sin(r);
- //m_pkChar->SetRotation(Random::get(0, 359)); //
+ //m_pkChar->SetRotation(Random::get(0, 359)); // 방향은 랜덤으로 설정
//GetDeltaByDegree(m_pkChar->GetRotation(), fDist, &fx, &fy);
- // Ӽ üũ; ġ ߰ ġ ٸ ʴ´.
+ // 느슨한 못감 속성 체크; 최종 위치와 중간 위치가 갈수없다면 가지 않는다.
//if (!(SECTREE_MANAGER::instance().IsMovablePosition(m_pkChar->GetMapIndex(), m_pkChar->GetX() + (int) fx, m_pkChar->GetY() + (int) fy)
// && SECTREE_MANAGER::instance().IsMovablePosition(m_pkChar->GetMapIndex(), m_pkChar->GetX() + (int) fx/2, m_pkChar->GetY() + (int) fy/2)))
// return true;
@@ -218,7 +218,7 @@ bool CPetActor::_UpdatAloneActionAI(float fMinDist, float fMaxDist)
return true;
}
-// char_state.cpp StateHorseԼ ׳ C&P -_-;
+// char_state.cpp StateHorse함수 그냥 C&P -_-;
bool CPetActor::_UpdateFollowAI()
{
if (0 == m_pkChar->m_pkMobData)
@@ -227,9 +227,9 @@ bool CPetActor::_UpdateFollowAI()
return false;
}
- // NOTE: ij() ̵ ӵ ˾ƾ ϴµ, ش (m_pkChar->m_pkMobData->m_table.sMovingSpeed) ؼ ˾Ƴ
- // m_pkChar->m_pkMobData invalid 찡 . ð ľϰ ϴ m_pkChar->m_pkMobData ƿ ʵ .
- // ⼭ Ź ˻ϴ ʱȭ 쵵 .. -_-;; ФФФФФФФФ
+ // NOTE: 캐릭터(펫)의 원래 이동 속도를 알아야 하는데, 해당 값(m_pkChar->m_pkMobData->m_table.sMovingSpeed)을 직접적으로 접근해서 알아낼 수도 있지만
+ // m_pkChar->m_pkMobData 값이 invalid한 경우가 자주 발생함. 현재 시간관계상 원인은 다음에 파악하고 일단은 m_pkChar->m_pkMobData 값을 아예 사용하지 않도록 함.
+ // 여기서 매번 검사하는 이유는 최초 초기화 할 때 정상 값을 제대로 못얻어오는 경우도 있음.. -_-;; ㅠㅠㅠㅠㅠㅠㅠㅠㅠ
if (0 == m_originalMoveSpeed)
{
const CMob* mobData = CMobManager::Instance().Get(m_dwVnum);
@@ -237,14 +237,14 @@ bool CPetActor::_UpdateFollowAI()
if (0 != mobData)
m_originalMoveSpeed = mobData->m_table.sMovingSpeed;
}
- float START_FOLLOW_DISTANCE = 300.0f; // Ÿ ̻ Ѿư
- float START_RUN_DISTANCE = 900.0f; // Ÿ ̻ پ Ѿư.
+ float START_FOLLOW_DISTANCE = 300.0f; // 이 거리 이상 떨어지면 쫓아가기 시작함
+ float START_RUN_DISTANCE = 900.0f; // 이 거리 이상 떨어지면 뛰어서 쫓아감.
- float RESPAWN_DISTANCE = 4500.f; // Ÿ ̻ ־ ȯ.
- int APPROACH = 200; // Ÿ
+ float RESPAWN_DISTANCE = 4500.f; // 이 거리 이상 멀어지면 주인 옆으로 소환함.
+ int APPROACH = 200; // 접근 거리
- bool bDoMoveAlone = true; // ijͿ ȥ ϰ -_-;
- bool bRun = false; // پ ϳ?
+ bool bDoMoveAlone = true; // 캐릭터와 가까이 있을 때 혼자 여기저기 움직일건지 여부 -_-;
+ bool bRun = false; // 뛰어야 하나?
DWORD currentTime = get_dword_time();
@@ -272,7 +272,7 @@ bool CPetActor::_UpdateFollowAI()
bRun = true;
}
- m_pkChar->SetNowWalking(!bRun); // NOTE: Լ ̸ ߴ° ˾Ҵµ SetNowWalking(false) ϸ ٴ°.. -_-;
+ m_pkChar->SetNowWalking(!bRun); // NOTE: 함수 이름보고 멈추는건줄 알았는데 SetNowWalking(false) 하면 뛰는거임.. -_-;
Follow(APPROACH);
@@ -288,7 +288,7 @@ bool CPetActor::_UpdateFollowAI()
// m_dwLastActionTime = currentTime;
// }
//}
- // Follow ΰ Ÿ ̳ ٸ
+ // Follow 중이지만 주인과 일정 거리 이내로 가까워졌다면 멈춤
else
m_pkChar->SendMovePacket(FUNC_WAIT, 0, 0, 0, 0);
//else if (currentTime - m_dwLastActionTime > Random::get(5000, 12000))
@@ -303,8 +303,8 @@ bool CPetActor::Update(DWORD deltaTime)
{
bool bResult = true;
- // ų, ȯ ° ̻ϴٸ . (NOTE: ̷ ȯ DEAD ¿ 찡 -_-;)
- // ȯ ų, ° ƴ϶ .
+ // 펫 주인이 죽었거나, 소환된 펫의 상태가 이상하다면 펫을 없앰. (NOTE: 가끔가다 이런 저런 이유로 소환된 펫이 DEAD 상태에 빠지는 경우가 있음-_-;)
+ // 펫을 소환한 아이템이 없거나, 내가 가진 상태가 아니라면 펫을 없앰.
if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead())
|| NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())
|| ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner()
@@ -320,10 +320,10 @@ bool CPetActor::Update(DWORD deltaTime)
return bResult;
}
-//NOTE : !!! MinDistance ũ ŭ ȭ follow ʴ´,
+//NOTE : 주의!!! MinDistance를 크게 잡으면 그 변위만큼의 변화동안은 follow하지 않는다,
bool CPetActor::Follow(float fMinDistance)
{
- // ġ ٶ Ѵ.
+ // 가려는 위치를 바라봐야 한다.
if( !m_pkOwner || !m_pkChar)
return false;
@@ -367,7 +367,7 @@ void CPetActor::SetSummonItem (LPITEM pItem)
void CPetActor::GiveBuff()
{
- // Ȳ .
+ // 파황 펫 버프는 던전에서만 발생함.
if (34004 == m_dwVnum || 34009 == m_dwVnum)
{
if (NULL == m_pkOwner->GetDungeon())
@@ -432,15 +432,15 @@ void CPetSystem::Destroy()
m_petActorMap.clear();
}
-/// ý Ʈ. ϵ AI ó .
+/// 펫 시스템 업데이트. 등록된 펫들의 AI 처리 등을 함.
bool CPetSystem::Update(DWORD deltaTime)
{
bool bResult = true;
DWORD currentTime = get_dword_time();
- // CHARACTER_MANAGER ijͷ Update Ű ִ (Pulse Ǿִ) Ӱ ð ˾Ҵµ
- // ٸ ̶-_-; Է deltaTime ǹ̰ Ф
+ // CHARACTER_MANAGER에서 캐릭터류 Update할 때 매개변수로 주는 (Pulse라고 되어있는)값이 이전 프레임과의 시간차이인줄 알았는데
+ // 전혀 다른 값이라서-_-; 여기에 입력으로 들어오는 deltaTime은 의미가 없음ㅠㅠ
if (m_dwUpdatePeriod > currentTime - m_dwLastUpdateTime)
return true;
@@ -473,7 +473,7 @@ bool CPetSystem::Update(DWORD deltaTime)
return bResult;
}
-/// Ͽ
+/// 관리 목록에서 펫을 지움
void CPetSystem::DeletePet(DWORD mobVnum)
{
TPetActorMap::iterator iter = m_petActorMap.find(mobVnum);
@@ -494,7 +494,7 @@ void CPetSystem::DeletePet(DWORD mobVnum)
m_petActorMap.erase(iter);
}
-/// Ͽ
+/// 관리 목록에서 펫을 지움
void CPetSystem::DeletePet(CPetActor* petActor)
{
for (TPetActorMap::iterator iter = m_petActorMap.begin(); iter != m_petActorMap.end(); ++iter)
@@ -542,7 +542,7 @@ CPetActor* CPetSystem::Summon(DWORD mobVnum, LPITEM pSummonItem, const char* pet
{
CPetActor* petActor = this->GetByVnum(mobVnum);
- // ϵ ƴ϶ Ͽ .
+ // 등록된 펫이 아니라면 새로 생성 후 관리 목록에 등록함.
if (0 == petActor)
{
petActor = M2_NEW CPetActor(m_pkOwner, mobVnum, options);
@@ -557,7 +557,7 @@ CPetActor* CPetSystem::Summon(DWORD mobVnum, LPITEM pSummonItem, const char* pet
info->pPetSystem = this;
- m_pkPetSystemUpdateEvent = event_create(petsystem_update_event, info, PASSES_PER_SEC(1) / 4); // 0.25
+ m_pkPetSystemUpdateEvent = event_create(petsystem_update_event, info, PASSES_PER_SEC(1) / 4); // 0.25초
}
return petActor;
@@ -589,7 +589,7 @@ CPetActor* CPetSystem::GetByVID(DWORD vid) const
return bFound ? petActor : 0;
}
-/// ߿ ־ VNUM ȯϴ Լ.
+/// 등록 된 펫 중에서 주어진 몹 VNUM을 가진 액터를 반환하는 함수.
CPetActor* CPetSystem::GetByVnum(DWORD vnum) const
{
CPetActor* petActor = 0;
diff --git a/src/game/src/PetSystem.h b/src/game/src/PetSystem.h
index 6348403..eda5bdd 100644
--- a/src/game/src/PetSystem.h
+++ b/src/game/src/PetSystem.h
@@ -4,7 +4,7 @@
class CHARACTER;
-// TODO: μ ɷġ? ģе, Ÿ... ġ
+// TODO: 펫으로서의 능력치? 라던가 친밀도, 배고픔 기타등등... 수치
struct SPetAbility
{
};
@@ -34,8 +34,8 @@ protected:
virtual bool Update(DWORD deltaTime);
protected:
- virtual bool _UpdateFollowAI(); ///< ٴϴ AI ó
- virtual bool _UpdatAloneActionAI(float fMinDist, float fMaxDist); ///< ó ȥ AI ó
+ virtual bool _UpdateFollowAI(); ///< 주인을 따라다니는 AI 처리
+ virtual bool _UpdatAloneActionAI(float fMinDist, float fMaxDist); ///< 주인 근처에서 혼자 노는 AI 처리
/// @TODO
//virtual bool _UpdateCombatAI();
@@ -62,13 +62,13 @@ public:
bool IsSummoned() const { return 0 != m_pkChar; }
void SetSummonItem (LPITEM pItem);
DWORD GetSummonItemVID () { return m_dwSummonItemVID; }
- // ִ Լ ŵδ Լ.
- // ̰ Ѱ, ,
- // POINT_MOV_SPEED, POINT_ATT_SPEED, POINT_CAST_SPEED PointChange() Լ Ἥ ҿ °,
- // PointChange() Ŀ ComputePoints() ϸ ϴ ʱȭǰ,
- // , ComputePoints() θ Ŭ POINT ʴ´ٴ Ŵ.
- // ִ ComputePoints() ο petsystem->RefreshBuff() θ Ͽ,
- // ClearBuff() θ, ComputePoints ϴ Ѵ.
+ // 버프 주는 함수와 거두는 함수.
+ // 이게 좀 괴랄한게, 서버가 ㅄ라서,
+ // POINT_MOV_SPEED, POINT_ATT_SPEED, POINT_CAST_SPEED는 PointChange()란 함수만 써서 변경해 봐야 소용이 없는게,
+ // PointChange() 이후에 어디선가 ComputePoints()를 하면 싹다 초기화되고,
+ // 더 웃긴건, ComputePoints()를 부르지 않으면 클라의 POINT는 전혀 변하지 않는다는 거다.
+ // 그래서 버프를 주는 것은 ComputePoints() 내부에서 petsystem->RefreshBuff()를 부르도록 하였고,
+ // 버프를 빼는 것은 ClearBuff()를 부르고, ComputePoints를 하는 것으로 한다.
void GiveBuff();
void ClearBuff();
@@ -87,7 +87,7 @@ private:
LPCHARACTER m_pkChar; // Instance of pet(CHARACTER)
LPCHARACTER m_pkOwner;
-// SPetAbility m_petAbility; // ɷġ
+// SPetAbility m_petAbility; // 능력치
};
/**
@@ -95,7 +95,7 @@ private:
class CPetSystem
{
public:
- typedef std::unordered_map TPetActorMap; /// map. ( ijͰ vnum ..??)
+ typedef std::unordered_map TPetActorMap; /// map. (한 캐릭터가 같은 vnum의 펫을 여러개 가질 일이 있을까..??)
public:
CPetSystem(LPCHARACTER owner);
@@ -107,7 +107,7 @@ public:
bool Update(DWORD deltaTime);
void Destroy();
- size_t CountSummoned() const; ///< ȯ(üȭ ijͰ ִ)
+ size_t CountSummoned() const; ///< 현재 소환된(실체화 된 캐릭터가 있는) 펫의 개수
public:
void SetUpdatePeriod(DWORD ms);
@@ -117,7 +117,7 @@ public:
void Unsummon(DWORD mobVnum, bool bDeleteFromList = false);
void Unsummon(CPetActor* petActor, bool bDeleteFromList = false);
- // TODO: ¥ ý . (ijͰ ߰ ...)
+ // TODO: 진짜 펫 시스템이 들어갈 때 구현. (캐릭터가 보유한 펫의 정보를 추가할 때 라던가...)
CPetActor* AddPet(DWORD mobVnum, const char* petName, const SPetAbility& ability, DWORD options = CPetActor::EPetOption_Followable | CPetActor::EPetOption_Summonable | CPetActor::EPetOption_Combatable);
void DeletePet(DWORD mobVnum);
@@ -126,8 +126,8 @@ public:
private:
TPetActorMap m_petActorMap;
- LPCHARACTER m_pkOwner; ///< ý Owner
- DWORD m_dwUpdatePeriod; ///< Ʈ ֱ (ms)
+ LPCHARACTER m_pkOwner; ///< 펫 시스템의 Owner
+ DWORD m_dwUpdatePeriod; ///< 업데이트 주기 (ms단위)
DWORD m_dwLastUpdateTime;
LPEVENT m_pkPetSystemUpdateEvent;
};
diff --git a/src/game/src/SpeedServer.cpp b/src/game/src/SpeedServer.cpp
index bd8c503..962359b 100644
--- a/src/game/src/SpeedServer.cpp
+++ b/src/game/src/SpeedServer.cpp
@@ -3,7 +3,7 @@
#include "SpeedServer.h"
#include "locale_service.h"
-// 赵 ʽ ġ ý
+// 쾌도 서버 보너스 경험치 시스템
// by rtsummit
CSpeedServerManager::CSpeedServerManager()
@@ -361,13 +361,13 @@ HME CSpeedServerEmpireExp::GetCurrentExpPriv(int &duration, bool &is_change)
HME hme;
- // ¥ holiday̸ holiday bonus Ѵ.
+ // 현재 날짜가 holiday이면 holiday bonus를 도입한다.
if (holi_it != holiday_map.end())
{
for (std::list ::iterator it = holi_it->second.begin();
it != wday_exp_table[datetime->tm_wday].end(); it++)
{
- // ð ð ȿ ԵǸ,
+ // 현재 시각이 시간 구간 안에 포함되면,
if (total_sec < (it->hour * 3600 + it->min * 60 ))
{
hme = *it;
@@ -380,7 +380,7 @@ HME CSpeedServerEmpireExp::GetCurrentExpPriv(int &duration, bool &is_change)
for (std::list ::iterator it = wday_exp_table[datetime->tm_wday].begin();
it != wday_exp_table[datetime->tm_wday].end(); it++)
{
- // ð ð ȿ ԵǸ,
+ // 현재 시각이 시간 구간 안에 포함되면,
if (total_sec < (it->hour * 3600 + it->min * 60 ))
{
hme = *it;
diff --git a/src/game/src/SpeedServer.h b/src/game/src/SpeedServer.h
index f4f61e6..eee5a90 100644
--- a/src/game/src/SpeedServer.h
+++ b/src/game/src/SpeedServer.h
@@ -4,11 +4,11 @@
#include
#include
-// castle.cpp ִ Ͽ
-#define EMPIRE_NONE 0 // ƹ ƴ
-#define EMPIRE_RED 1 // ż
-#define EMPIRE_YELLOW 2 // õ
-#define EMPIRE_BLUE 3 //
+// castle.cpp 에 있는 것을 복붙 하였다
+#define EMPIRE_NONE 0 // 아무국가 아님
+#define EMPIRE_RED 1 // 신수
+#define EMPIRE_YELLOW 2 // 천조
+#define EMPIRE_BLUE 3 // 진노
class HME
{
diff --git a/src/game/src/TrafficProfiler.h b/src/game/src/TrafficProfiler.h
index 50aaf20..80aa37b 100644
--- a/src/game/src/TrafficProfiler.h
+++ b/src/game/src/TrafficProfiler.h
@@ -12,17 +12,17 @@
/**
* @class TrafficProfiler
- * @brief Network I/O traffic Ŷ ϴ profiler.
+ * @brief Network I/O traffic 을 패킷 단위로 측정하는 profiler.
* @author Bang2ni
* @version 05/07/07 Bang2ni - First release.
*
- * ð Network I/O traffic Ŷ ϰ, Text file · ۼѴ.
+ * 시간대 별로 Network I/O 의 traffic 을 패킷 단위로 측정하고, Text file 형태로 보고서를 작성한다.
*/
class TrafficProfiler : public singleton< TrafficProfiler >
{
public:
- /// I/O
+ /// I/O 방향
enum IODirection {
IODIR_INPUT = 0, ///< Input
IODIR_OUTPUT, ///< Output
@@ -37,25 +37,25 @@ class TrafficProfiler : public singleton< TrafficProfiler >
/// Destructor
~TrafficProfiler( void );
- /// Profiling ʿ ʱȭ Ѵ.
+ /// Profiling 에 필요한 초기화를 한다.
/**
- * @param [in] dwFlushCycle Flush ֱ. ̴.
- * @param [in] pszLogFileName Profiling log file ̸
- * @return false profiling log file open ߴ.
+ * @param [in] dwFlushCycle Flush 주기. 초 단위이다.
+ * @param [in] pszLogFileName Profiling log file 의 이름
+ * @return false 일 경우 profiling log file 을 open 하지 못했다.
*
- * profiling log file open() Ѵ.
+ * profiling log file 을 open(생성) 한다.
*/
bool Initialize( DWORD dwFlushCycle, const char* pszLogFileName );
- /// Profiling ۵ưų Packet Report Ѵ.
+ /// Profiling 을 위해 전송됐거나 전송 할 Packet 을 Report 한다.
/**
- * @param [in] dir Profiling Packet
- * @param [in] byHeader Packet
- * @param [in] dwSize Packet size
- * @return Initialize ʾҴٸ false ȯѴ.
+ * @param [in] dir Profiling 할 Packet 의 방향
+ * @param [in] byHeader Packet 헤더
+ * @param [in] dwSize Packet 의 총 size
+ * @return Initialize 되지 않았다면 false 를 반환한다.
*
- * Packet شϴ size Ų.
- * Initialize ij ֱ Flush Ŀ Flush ֱ ŭ ð 帥 ȣȴٸ Report Flush Ѵ.
+ * Packet 에 해당하는 size 를 누적시킨다.
+ * Initialize 이후나 최근 Flush 된 이후에 Flush 주기 만큼 시간이 흐른 후 호출된다면 Report 이후 Flush 한다.
*/
bool Report( IODirection dir, BYTE byHeader, DWORD dwSize )
{
@@ -65,22 +65,22 @@ class TrafficProfiler : public singleton< TrafficProfiler >
return true;
}
- /// Report Ͽ .
+ /// 현재까지 Report 된 내용을 파일에 쓴다.
/**
- * @return Initialize ʾҴ.
+ * @return Initialize 되지 않았다.
*/
bool Flush( void );
private:
- /// Profling õ variables ʱȭ Ѵ.
+ /// Profling 에 관련된 variables 를 초기화 한다.
void InitializeProfiling( void );
- /// Report Packet traffic Ѵ.
+ /// Report 된 Packet 의 traffic 를 계산한다.
/**
- * @param [in] dir Profiling Packet
- * @param [in] byHeader Packet
- * @param [in] dwSize Packet size
+ * @param [in] dir Profiling 할 Packet 의 방향
+ * @param [in] byHeader Packet 헤더
+ * @param [in] dwSize Packet 의 총 size
*/
void ComputeTraffic( IODirection dir, BYTE byHeader, DWORD dwSize )
{
@@ -96,8 +96,8 @@ class TrafficProfiler : public singleton< TrafficProfiler >
/// Traffic info type.
/**
- * first: size
- * second: packet ۵ Ƚ
+ * first: 누적된 총 size
+ * second: 이 packet 이 전송된 횟수
*/
typedef std::pair< DWORD, DWORD > TrafficInfo;
@@ -105,11 +105,11 @@ class TrafficProfiler : public singleton< TrafficProfiler >
typedef std::vector< TrafficInfo > TrafficVec;
FILE* m_pfProfileLogFile; ///< Profile log file pointer
- DWORD m_dwFlushCycle; ///< Flush ֱ
- time_t m_tmProfileStartTime; ///< ð. Flush Update ȴ.
- DWORD m_dwTotalTraffic; ///< Report Traffic 뷮
- DWORD m_dwTotalPacket; ///< Report Packet
- TrafficVec m_aTrafficVec[ IODIR_MAX ]; ///< Report Traffic vector 迭. ⸶ vector .
+ DWORD m_dwFlushCycle; ///< Flush 주기
+ time_t m_tmProfileStartTime; ///< 프로파일을 시작한 시간. Flush 될 때마다 Update 된다.
+ DWORD m_dwTotalTraffic; ///< Report 된 총 Traffic 용량
+ DWORD m_dwTotalPacket; ///< Report 된 총 Packet 수
+ TrafficVec m_aTrafficVec[ IODIR_MAX ]; ///< Report 된 Traffic 을 저장할 vector의 배열. 각 방향마다 vector 를 가진다.
};
#endif // _METIN_II_TRAFFICPROFILER_H_
diff --git a/src/game/src/affect.h b/src/game/src/affect.h
index 90e610b..69cbefa 100644
--- a/src/game/src/affect.h
+++ b/src/game/src/affect.h
@@ -54,23 +54,23 @@ enum EAffectTypes
AFFECT_DEF_GRADE, // 226
AFFECT_PREMIUM_START = 500,
- AFFECT_EXP_BONUS = 500, //
- AFFECT_ITEM_BONUS = 501, // 尩
+ AFFECT_EXP_BONUS = 500, // 경험의 반지
+ AFFECT_ITEM_BONUS = 501, // 도둑의 장갑
AFFECT_SAFEBOX = 502, // PREMIUM_SAFEBOX,
AFFECT_AUTOLOOT = 503, // PREMIUM_AUTOLOOT,
AFFECT_FISH_MIND = 504, // PREMIUM_FISH_MIND,
- AFFECT_MARRIAGE_FAST = 505, //
- AFFECT_GOLD_BONUS = 506, // Ȯ 50%
+ AFFECT_MARRIAGE_FAST = 505, // 원앙의 깃털
+ AFFECT_GOLD_BONUS = 506, // 돈 드롭확률 50%증가
AFFECT_PREMIUM_END = 509,
- AFFECT_MALL = 510, // Ʈ
- AFFECT_NO_DEATH_PENALTY = 511, // ȣ (ġ гƼ ѹ ش)
- AFFECT_SKILL_BOOK_BONUS = 512, // (å Ȯ 50% )
- AFFECT_SKILL_NO_BOOK_DELAY = 513, // ־ȼ
+ AFFECT_MALL = 510, // 몰 아이템 에펙트
+ AFFECT_NO_DEATH_PENALTY = 511, // 용신의 가호 (경험치가 패널티를 한번 막아준다)
+ AFFECT_SKILL_BOOK_BONUS = 512, // 선인의 교훈 (책 수련 성공 확률이 50% 증가)
+ AFFECT_SKILL_NO_BOOK_DELAY = 513, // 주안술서
- AFFECT_HAIR = 514, // ȿ
- AFFECT_COLLECT = 515, //Ʈ
- AFFECT_EXP_BONUS_EURO_FREE = 516, // ( 14 ⺻ ȿ)
+ AFFECT_HAIR = 514, // 헤어 효과
+ AFFECT_COLLECT = 515, //수집퀘스트
+ AFFECT_EXP_BONUS_EURO_FREE = 516, // 경험의 반지 (유럽 버전 14 레벨 이하 기본 효과)
AFFECT_EXP_BONUS_EURO_FREE_UNDER_15 = 517,
AFFECT_UNIQUE_ABILITY = 518,
@@ -121,8 +121,8 @@ enum EAffectBits
AFF_SLOW,
AFF_STUN,
- AFF_DUNGEON_READY, // غ
- AFF_DUNGEON_UNIQUE, // ũ (Ŭ̾Ʈ ø)
+ AFF_DUNGEON_READY, // 던전에서 준비 상태
+ AFF_DUNGEON_UNIQUE, // 던전 유니크 (클라이언트에서 컬링되지않음)
AFF_BUILDING_CONSTRUCTION_SMALL,
AFF_BUILDING_CONSTRUCTION_LARGE,
@@ -133,34 +133,34 @@ enum EAffectBits
AFF_FISH_MIND,
- AFF_JEONGWIHON, // ȥ
- AFF_GEOMGYEONG, // ˰
- AFF_CHEONGEUN, // õ
- AFF_GYEONGGONG, //
- AFF_EUNHYUNG, //
- AFF_GWIGUM, // Ͱ
- AFF_TERROR, //
- AFF_JUMAGAP, // ָ
- AFF_HOSIN, // ȣ
- AFF_BOHO, // ȣ
- AFF_KWAESOK, //
- AFF_MANASHIELD, //
- AFF_MUYEONG, // affect
- AFF_REVIVE_INVISIBLE, // Ȱ õ
- AFF_FIRE, //
- AFF_GICHEON, // õ
- AFF_JEUNGRYEOK, // ¼
- AFF_TANHWAN_DASH, // źȯݿ Ʈ
- AFF_PABEOP, // Ĺ
- AFF_CHEONGEUN_WITH_FALL, // õ
+ AFF_JEONGWIHON, // 전귀혼
+ AFF_GEOMGYEONG, // 검경
+ AFF_CHEONGEUN, // 천근추
+ AFF_GYEONGGONG, // 경공술
+ AFF_EUNHYUNG, // 은형법
+ AFF_GWIGUM, // 귀검
+ AFF_TERROR, // 공포
+ AFF_JUMAGAP, // 주마갑
+ AFF_HOSIN, // 호신
+ AFF_BOHO, // 보호
+ AFF_KWAESOK, // 쾌속
+ AFF_MANASHIELD, // 마나쉴드
+ AFF_MUYEONG, // 무영진 affect
+ AFF_REVIVE_INVISIBLE, // 부활시 잠시동안 무적
+ AFF_FIRE, // 지속 불 데미지
+ AFF_GICHEON, // 기천대공
+ AFF_JEUNGRYEOK, // 증력술
+ AFF_TANHWAN_DASH, // 탄환격용 달리기어펙트
+ AFF_PABEOP, // 파법술
+ AFF_CHEONGEUN_WITH_FALL, // 천근추
AFF_POLYMORPH,
AFF_WAR_FLAG1,
AFF_WAR_FLAG2,
AFF_WAR_FLAG3,
AFF_CHINA_FIREWORK,
- AFF_HAIR, //
- AFF_GERMANY, //
+ AFF_HAIR, // 헤어
+ AFF_GERMANY, // 독일
AFF_BITS_MAX
};
@@ -170,11 +170,11 @@ extern void SendAffectAddPacket(LPDESC d, CAffect * pkAff);
// AFFECT_DURATION_BUG_FIX
enum AffectVariable
{
- // Affect Ѵ ־ .
- // ð ̱ ſ ū Ѵ븦 ķ̼.
- //// 24Ʈ Ƿ 25Ʈ .
- // ... 25Ʈ Ѵٰ س 29bit ϰ ִ û ̶ּ...
- // collect quest ð 60 ϰ Ƿ, 60 .
+ // Affect가 무한대로 들어가 있어야 할 경우 사용.
+ // 시간을 계속 줄이기 때문에 매우 큰값으로 무한대를 에뮬레이션함.
+ //// 24비트는 적으므로 25비트를 사용.
+ // ... 25비트 사용한다고 해놓고선 29bit 사용하고 있는 엄청난 주석이란...
+ // collect quest에서 무한 시간을 60년으로 사용하고 있으므로, 여기도 60년으로 하자.
INFINITE_AFFECT_DURATION = 60 * 365 * 24 * 60 * 60
};
diff --git a/src/game/src/ani.cpp b/src/game/src/ani.cpp
index 7f2469d..d49599b 100644
--- a/src/game/src/ani.cpp
+++ b/src/game/src/ani.cpp
@@ -55,7 +55,7 @@ const char* FN_weapon_type(int weapon)
class ANI
{
protected:
- // [][Ϲ0Ż1][][]
+ // [종족][일반0탈것1][무기][콤보]
DWORD m_speed[MAIN_RACE_MAX_NUM][2][WEAPON_NUM_TYPES][9];
public:
@@ -126,14 +126,14 @@ ANI::ANI()
bool ANI::load()
{
const char* dir_name[MAIN_RACE_MAX_NUM] = {
- "data/pc/warrior", // ()
- "data/pc/assassin", // ڰ()
- "data/pc/sura", // ()
- "data/pc/shaman", // ()
- "data/pc2/warrior", // ()
- "data/pc2/assassin", // ڰ()
- "data/pc2/sura", // ()
- "data/pc2/shaman" // ()
+ "data/pc/warrior", // 무사(남)
+ "data/pc/assassin", // 자객(여)
+ "data/pc/sura", // 수라(남)
+ "data/pc/shaman", // 무당(여)
+ "data/pc2/warrior", // 무사(여)
+ "data/pc2/assassin", // 자객(남)
+ "data/pc2/sura", // 수라(여)
+ "data/pc2/shaman" // 무당(남)
};
for (int race = 0; race GetPoint(POINT_ATT_SPEED));
*/
- /* ڵ ҵ ↓ݰ ¸ */
- /* Ѽհ ӵ */
+ /* 투핸디드 소드의 경우 삼연참공격과 승마시 */
+ /* 오류가 많아 한손검 속도로 생각하자 */
if (weapon == WEAPON_TWO_HANDED)
weapon = WEAPON_SWORD;
diff --git a/src/game/src/arena.cpp b/src/game/src/arena.cpp
index 5e4d878..e3172bd 100644
--- a/src/game/src/arena.cpp
+++ b/src/game/src/arena.cpp
@@ -233,17 +233,17 @@ EVENTFUNC(ready_to_start_event)
if (chA != NULL)
{
- chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" 밡 մϴ."));
+ chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel has finished, because your combatant vanished."));
SPDLOG_DEBUG("ARENA: Oppernent is disappered. MyPID({}) OppPID({})", pArena->GetPlayerAPID(), pArena->GetPlayerBPID());
}
if (chB != NULL)
{
- chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" 밡 մϴ."));
+ chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel has finished, because your combatant vanished."));
SPDLOG_DEBUG("ARENA: Oppernent is disappered. MyPID({}) OppPID({})", pArena->GetPlayerBPID(), pArena->GetPlayerAPID());
}
- pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT(" 밡 մϴ."));
+ pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("The duel has finished, because your combatant vanished."));
pArena->EndDuel();
return 0;
@@ -260,20 +260,20 @@ EVENTFUNC(ready_to_start_event)
if (count > 10000)
{
- chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ϴ."));
- chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ϴ."));
+ chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("There is no limit for Potions."));
+ chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("There is no limit for Potions."));
}
else
{
chA->SetPotionLimit(count);
chB->SetPotionLimit(count);
- chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" %d մϴ."), chA->GetPotionLimit());
- chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" %d մϴ."), chB->GetPotionLimit());
+ chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can use up to %d potions."), chA->GetPotionLimit());
+ chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You can use up to %d potions."), chB->GetPotionLimit());
}
- chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10ʵ ۵˴ϴ."));
- chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10ʵ ۵˴ϴ."));
- pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("10ʵ ۵˴ϴ."));
+ chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The fight will start in 10 seconds."));
+ chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The fight will start in 10 seconds."));
+ pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("The fight will start in 10 seconds."));
info->state++;
return PASSES_PER_SEC(10);
@@ -282,15 +282,15 @@ EVENTFUNC(ready_to_start_event)
case 1:
{
- chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ۵Ǿϴ."));
- chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ۵Ǿϴ."));
- pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT(" ۵Ǿϴ."));
+ chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel has begun."));
+ chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel has begun."));
+ pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("The duel has begun."));
TPacketGCDuelStart duelStart;
duelStart.header = HEADER_GC_DUEL_START;
duelStart.wSize = sizeof(TPacketGCDuelStart) + 4;
- DWORD dwOppList[8]; // ִ Ƽ 8 ̹Ƿ..
+ DWORD dwOppList[8]; // 최대 파티원 8명 이므로..
dwOppList[0] = (DWORD)chB->GetVID();
TEMP_BUFFER buf;
@@ -339,7 +339,7 @@ EVENTFUNC(ready_to_start_event)
TEMP_BUFFER buf;
TEMP_BUFFER buf2;
- DWORD dwOppList[8]; // ִ Ƽ 8 ̹Ƿ..
+ DWORD dwOppList[8]; // 최대 파티원 8명 이므로..
TPacketGCDuelStart duelStart;
duelStart.header = HEADER_GC_DUEL_START;
duelStart.wSize = sizeof(TPacketGCDuelStart) + 4;
@@ -354,9 +354,9 @@ EVENTFUNC(ready_to_start_event)
buf2.write(&dwOppList[0], 4);
chB->GetDesc()->Packet(buf2.read_peek(), buf2.size());
- chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ۵Ǿϴ."));
- chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ۵Ǿϴ."));
- pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT(" ۵Ǿϴ."));
+ chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel has begun."));
+ chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel has begun."));
+ pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("The duel has begun."));
pArena->ClearEvent();
@@ -366,9 +366,9 @@ EVENTFUNC(ready_to_start_event)
default:
{
- chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" Ͽ մϴ."));
- chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" Ͽ մϴ."));
- pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT(" Ͽ մϴ."));
+ chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel is being finished because there is a problem in the duel arena."));
+ chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel is being finished because there is a problem in the duel arena."));
+ pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("The duel is being finished because there is a problem in the duel arena."));
SPDLOG_DEBUG("ARENA: Something wrong in event func. info->state({})", info->state);
@@ -407,17 +407,17 @@ EVENTFUNC(duel_time_out)
{
if (chA != NULL)
{
- chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" 밡 մϴ."));
+ chA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel has finished, because your combatant vanished."));
SPDLOG_DEBUG("ARENA: Oppernent is disappered. MyPID({}) OppPID({})", pArena->GetPlayerAPID(), pArena->GetPlayerBPID());
}
if (chB != NULL)
{
- chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" 밡 մϴ."));
+ chB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The duel has finished, because your combatant vanished."));
SPDLOG_DEBUG("ARENA: Oppernent is disappered. MyPID({}) OppPID({})", pArena->GetPlayerBPID(), pArena->GetPlayerAPID());
}
- pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT(" 밡 մϴ."));
+ pArena->SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("The duel has finished, because your combatant vanished."));
pArena->EndDuel();
return 0;
@@ -427,14 +427,14 @@ EVENTFUNC(duel_time_out)
switch (info->state)
{
case 0:
- pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT(" ð ʰ ߴմϴ."));
- pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("10ʵ ̵մϴ."));
+ pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("The duel has finished because of a timeout."));
+ pArena->SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("In 10 seconds you will be teleported into the city."));
- chA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT(" ð ʰ ߴմϴ."));
- chA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("10ʵ ̵մϴ."));
+ chA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("The duel has finished because of a timeout."));
+ chA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("In 10 seconds you will be teleported into the city."));
- chB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT(" ð ʰ ߴմϴ."));
- chB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("10ʵ ̵մϴ."));
+ chB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("The duel has finished because of a timeout."));
+ chB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("In 10 seconds you will be teleported into the city."));
TPacketGCDuelStart duelStart;
duelStart.header = HEADER_GC_DUEL_START;
@@ -678,7 +678,7 @@ bool CArenaMap::CanAttack(LPCHARACTER pCharAttacker, LPCHARACTER pCharVictim)
bool CArena::CanAttack(DWORD dwPIDA, DWORD dwPIDB)
{
- // 1:1 ٴ ʿ
+ // 1:1 전용 다대다 할 경우 수정 필요
if (m_dwPIDA == dwPIDA && m_dwPIDB == dwPIDB) return true;
if (m_dwPIDA == dwPIDB && m_dwPIDB == dwPIDA) return true;
@@ -728,20 +728,20 @@ bool CArena::OnDead(DWORD dwPIDA, DWORD dwPIDB)
if (pCharA == NULL && pCharB == NULL)
{
- // Ѵ ?!
- SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT(" Ͽ ߴմϴ."));
+ // 둘다 접속이 끊어졌다 ?!
+ SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("The duel has been stopped because there is a problem in the arena."));
restart = false;
}
else if (pCharA == NULL && pCharB != NULL)
{
- pCharB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT(" ij Ͽ մϴ."));
- SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT(" Ͽ մϴ."));
+ pCharB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("Your combatant has got some problems. The duel is being cancelled."));
+ SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("The duel is being cancelled as there is a problem with the combatant."));
restart = false;
}
else if (pCharA != NULL && pCharB == NULL)
{
- pCharA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT(" ij Ͽ մϴ."));
- SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT(" Ͽ մϴ."));
+ pCharA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("Your combatant has got some problems. The duel is being cancelled."));
+ SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("The duel is being cancelled as there is a problem with the combatant."));
restart = false;
}
else if (pCharA != NULL && pCharB != NULL)
@@ -752,9 +752,9 @@ bool CArena::OnDead(DWORD dwPIDA, DWORD dwPIDB)
if (m_dwSetPointOfA >= m_dwSetCount)
{
- pCharA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s ÿ ¸Ͽϴ."), pCharA->GetName());
- pCharB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s ÿ ¸Ͽϴ."), pCharA->GetName());
- SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("%s ÿ ¸Ͽϴ."), pCharA->GetName());
+ pCharA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s has won the duel."), pCharA->GetName());
+ pCharB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s has won the duel."), pCharA->GetName());
+ SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("%s has won the duel."), pCharA->GetName());
SPDLOG_DEBUG("ARENA: Duel is end. Winner {}({}) Loser {}({})",
pCharA->GetName(), GetPlayerAPID(), pCharB->GetName(), GetPlayerBPID());
@@ -762,10 +762,10 @@ bool CArena::OnDead(DWORD dwPIDA, DWORD dwPIDB)
else
{
restart = true;
- pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¸Ͽϴ."), pCharA->GetName());
+ pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s has won."), pCharA->GetName());
pCharA->ChatPacket(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
- pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¸Ͽϴ."), pCharA->GetName());
+ pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s has won."), pCharA->GetName());
pCharB->ChatPacket(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
SendChatPacketToObserver(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
@@ -779,19 +779,19 @@ bool CArena::OnDead(DWORD dwPIDA, DWORD dwPIDB)
m_dwSetPointOfB++;
if (m_dwSetPointOfB >= m_dwSetCount)
{
- pCharA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s ÿ ¸Ͽϴ."), pCharB->GetName());
- pCharB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s ÿ ¸Ͽϴ."), pCharB->GetName());
- SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("%s ÿ ¸Ͽϴ."), pCharB->GetName());
+ pCharA->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s has won the duel."), pCharB->GetName());
+ pCharB->ChatPacket(CHAT_TYPE_NOTICE, LC_TEXT("%s has won the duel."), pCharB->GetName());
+ SendChatPacketToObserver(CHAT_TYPE_NOTICE, LC_TEXT("%s has won the duel."), pCharB->GetName());
SPDLOG_DEBUG("ARENA: Duel is end. Winner({}) Loser({})", GetPlayerBPID(), GetPlayerAPID());
}
else
{
restart = true;
- pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¸Ͽϴ."), pCharB->GetName());
+ pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s has won."), pCharB->GetName());
pCharA->ChatPacket(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
- pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s ¸Ͽϴ."), pCharB->GetName());
+ pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s has won."), pCharB->GetName());
pCharB->ChatPacket(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
SendChatPacketToObserver(CHAT_TYPE_NOTICE, "%s %d : %d %s", pCharA->GetName(), m_dwSetPointOfA, m_dwSetPointOfB, pCharB->GetName());
@@ -811,18 +811,18 @@ bool CArena::OnDead(DWORD dwPIDA, DWORD dwPIDB)
}
else
{
- // ȵȴ ?!
+ // 오면 안된다 ?!
}
if (restart == false)
{
if (pCharA != NULL)
- pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10ʵ ǵưϴ."));
+ pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You will be teleported into the city in 10 seconds."));
if ( pCharB != NULL)
- pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10ʵ ǵưϴ."));
+ pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You will be teleported into the city in 10 seconds."));
- SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("10ʵ ǵưϴ."));
+ SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("You will be teleported into the city in 10 seconds."));
if (m_pEvent != NULL) {
event_cancel(&m_pEvent);
@@ -838,12 +838,12 @@ bool CArena::OnDead(DWORD dwPIDA, DWORD dwPIDB)
else
{
if (pCharA != NULL)
- pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10ʵ մϴ."));
+ pCharA->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The next round will begin in 10 seconds."));
if (pCharB != NULL)
- pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("10ʵ մϴ."));
+ pCharB->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The next round will begin in 10 seconds."));
- SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("10ʵ մϴ."));
+ SendChatPacketToObserver(CHAT_TYPE_INFO, LC_TEXT("The next round will begin in 10 seconds."));
if (m_pEvent != NULL) {
event_cancel(&m_pEvent);
@@ -949,7 +949,7 @@ void CArena::OnDisconnect(DWORD pid)
if (m_dwPIDA == pid)
{
if (GetPlayerB() != NULL)
- GetPlayerB()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ijͰ Ͽ մϴ."));
+ GetPlayerB()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The combatants have been separated. The duel has been stopped."));
SPDLOG_DEBUG("ARENA : Duel is end because of Opp({}) is disconnect. MyPID({})", GetPlayerAPID(), GetPlayerBPID());
EndDuel();
@@ -957,7 +957,7 @@ void CArena::OnDisconnect(DWORD pid)
else if (m_dwPIDB == pid)
{
if (GetPlayerA() != NULL)
- GetPlayerA()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT(" ijͰ Ͽ մϴ."));
+ GetPlayerA()->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("The combatants have been separated. The duel has been stopped."));
SPDLOG_DEBUG("ARENA : Duel is end because of Opp({}) is disconnect. MyPID({})", GetPlayerBPID(), GetPlayerAPID());
EndDuel();
@@ -1097,38 +1097,3 @@ bool CArena::RegisterObserverPtr(LPCHARACTER pChar)
return true;
}
-bool CArenaManager::IsLimitedItem( int lMapIndex, DWORD dwVnum )
-{
- if ( IsArenaMap( lMapIndex ) == true )
- {
- if ( LC_IsCanada() == true )
- {
- switch ( dwVnum )
- {
- case 50020:
- case 50021:
- case 50022:
- case 50801:
- case 50802:
- case 50813:
- case 50814:
- case 50817:
- case 50818:
- case 50819:
- case 50820:
- case 50821:
- case 50822:
- case 50823:
- case 50824:
- case 50825:
- case 50826:
- case 71044:
- case 71055:
- return true;
- }
- }
- }
-
- return false;
-}
-
diff --git a/src/game/src/arena.h b/src/game/src/arena.h
index 7d683d8..833655a 100644
--- a/src/game/src/arena.h
+++ b/src/game/src/arena.h
@@ -131,8 +131,6 @@ class CArenaManager : public singleton
bool IsArenaMap(DWORD dwMapIndex);
MEMBER_IDENTITY IsMember(DWORD dwMapIndex, DWORD PID);
-
- bool IsLimitedItem( int lMapIndex, DWORD dwVnum );
};
#endif /*__CLASS_ARENA_MANAGER__*/
diff --git a/src/game/src/auction_manager.cpp b/src/game/src/auction_manager.cpp
index 32833a8..03cbff7 100644
--- a/src/game/src/auction_manager.cpp
+++ b/src/game/src/auction_manager.cpp
@@ -215,7 +215,7 @@ void AuctionBoard::YourItemInfoList (TItemInfoVec& vec, DWORD player_id, int sta
}
// 0~1, 2~3, 4~5, 6~7, 8~9
-// ¦ descending, Ȧ accending.
+// 짝수면 descending, 홀수면 accending.
struct FCheckGradeSatisfied
{
BYTE grade;
@@ -796,7 +796,7 @@ void AuctionManager::YourBidItemInfoList (AuctionBoard::TItemInfoVec& vec, DWORD
}
else
{
- // expired ⼭ ־Ѵ.
+ // expired 만들고 여기서 넣어야한다.
}
}
}
@@ -881,21 +881,21 @@ void AuctionManager::enroll_auction (LPCHARACTER ch, LPITEM item, BYTE empire, i
}
if (item->IsEquipped())
{
- ch->ChatPacket(CHAT_TYPE_INFO, " .");
+ ch->ChatPacket(CHAT_TYPE_INFO, "I can't register anything that's equipped.");
return;
}
if (GetAuctionItemInfo (item->GetID()))
{
SPDLOG_ERROR("Item {} is already in auction.", item->GetID());
- ch->ChatPacket(CHAT_TYPE_INFO, "̹ ž. ü ?");
+ ch->ChatPacket(CHAT_TYPE_INFO, "I'm already registered. What the heck?");
return;
}
if (item->GetWindow() == AUCTION)
{
SPDLOG_ERROR("Item {} is already in auction.", item->GetID());
- ch->ChatPacket(CHAT_TYPE_INFO, " ..");
+ ch->ChatPacket(CHAT_TYPE_INFO, "What the hell is this...");
return;
}
@@ -918,21 +918,21 @@ void AuctionManager::enroll_sale (LPCHARACTER ch, LPITEM item, DWORD wisher_id,
}
if (item->IsEquipped())
{
- ch->ChatPacket(CHAT_TYPE_INFO, " .");
+ ch->ChatPacket(CHAT_TYPE_INFO, "I can't register anything that's equipped.");
return;
}
if (GetSaleItemInfo (item->GetID()))
{
SPDLOG_ERROR("Item {} is already in auction.", item->GetID());
- ch->ChatPacket(CHAT_TYPE_INFO, "̹ ž. ü ?");
+ ch->ChatPacket(CHAT_TYPE_INFO, "I'm already registered. What the heck?");
return;
}
if (item->GetWindow() == AUCTION)
{
SPDLOG_ERROR("Item {} is already in auction.", item->GetID());
- ch->ChatPacket(CHAT_TYPE_INFO, " ..");
+ ch->ChatPacket(CHAT_TYPE_INFO, "What the hell is this...");
return;
}
@@ -959,11 +959,11 @@ void AuctionManager::bid (LPCHARACTER ch, DWORD item_id, int bid_price)
std::pair mb = MyBid.GetMoney(ch->GetPlayerID(), item_id);
if (mb.first != -1)
{
- ch->ChatPacket (CHAT_TYPE_INFO, " ϶ ̴.");
+ ch->ChatPacket (CHAT_TYPE_INFO, "Re-bid.");
}
if (ch->GetGold() < bid_price)
{
- ch->ChatPacket(CHAT_TYPE_INFO, " ");
+ ch->ChatPacket(CHAT_TYPE_INFO, "I don't have enough money");
return;
}
@@ -975,7 +975,7 @@ void AuctionManager::bid (LPCHARACTER ch, DWORD item_id, int bid_price)
}
// fixme
-// ݵ !!!
+// 반드시 돈!!!
void AuctionManager::immediate_purchase (LPCHARACTER ch, DWORD item_id)
{
TAuctionItemInfo* item_info = GetAuctionItemInfo (item_id);
@@ -988,13 +988,13 @@ void AuctionManager::immediate_purchase (LPCHARACTER ch, DWORD item_id)
if (item_info->get_impur_price() == 0)
{
- ch->ChatPacket(CHAT_TYPE_INFO, "ﱸ ");
+ ch->ChatPacket(CHAT_TYPE_INFO, "Improvisation");
return;
}
if (ch->GetGold() < item_info->get_impur_price())
{
- ch->ChatPacket(CHAT_TYPE_INFO, " ");
+ ch->ChatPacket(CHAT_TYPE_INFO, "I don't have enough money");
return;
}
@@ -1005,7 +1005,7 @@ void AuctionManager::immediate_purchase (LPCHARACTER ch, DWORD item_id)
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_impur, sizeof(TPacketGDCommnadAuction));
}
-//
+// 시작
void AuctionManager::get_auctioned_item (LPCHARACTER ch, DWORD item_id, DWORD item_num)
{
TItemTable* proto = ITEM_MANAGER::instance().GetTable(item_num);
@@ -1013,7 +1013,7 @@ void AuctionManager::get_auctioned_item (LPCHARACTER ch, DWORD item_id, DWORD it
if (pos == -1)
{
- ch->ChatPacket(CHAT_TYPE_INFO, "ڸ ");
+ ch->ChatPacket(CHAT_TYPE_INFO, "Tight Spot");
return;
}
@@ -1069,13 +1069,13 @@ void AuctionManager::rebid (LPCHARACTER ch, DWORD item_id, int bid_price)
if (lock)
{
- ch->ChatPacket(CHAT_TYPE_INFO, " ̾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "You're bidding.");
return;
}
if (ch->GetGold() + money < bid_price)
{
- ch->ChatPacket(CHAT_TYPE_INFO, " ");
+ ch->ChatPacket(CHAT_TYPE_INFO, "I don't have enough money");
return;
}
@@ -1101,14 +1101,14 @@ void AuctionManager::bid_cancel (LPCHARACTER ch, DWORD item_id)
if (lock)
{
- ch->ChatPacket(CHAT_TYPE_INFO, " ̾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "You're bidding.");
return;
}
TAuctionItemInfo* item_info = GetAuctionItemInfo(item_id);
if (item_info->get_bidder_id() == ch->GetPlayerID())
{
- ch->ChatPacket(CHAT_TYPE_INFO, "ϰ ְ ھ. .");
+ ch->ChatPacket(CHAT_TYPE_INFO, "You're the highest bidder. I can't cancel.");
return;
}
@@ -1120,7 +1120,7 @@ void AuctionManager::bid_cancel (LPCHARACTER ch, DWORD item_id)
db_clientdesc->DBPacket(HEADER_GD_COMMAND_AUCTION, ch->GetPlayerID(), &pack_bc, sizeof(TPacketGDCommnadAuction));
}
-//
+// 끝
void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuction* cmd_result)
{
LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID(commander_id);
@@ -1142,7 +1142,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
Auction.InsertItemInfo (item_info);
if (ch != NULL)
{
- ch->ChatPacket(CHAT_TYPE_INFO, "忡 ߾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "You've registered for the auction.");
}
break;
}
@@ -1157,7 +1157,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
LPCHARACTER ch = CHARACTER_MANAGER::instance().FindByPID (player_item->owner);
ch->AutoGiveItem (item, true);
- ch->ChatPacket(CHAT_TYPE_INFO, "忡 ߾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "Failed to register for the auction house.");
}
break;
}
@@ -1179,7 +1179,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
Sale.InsertItemInfo (item_info);
if (ch != NULL)
{
- ch->ChatPacket(CHAT_TYPE_INFO, "Ǹ忡 ߾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "You've signed up for a storefront.");
}
break;
}
@@ -1193,7 +1193,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
ch->AutoGiveItem (item, true);
- ch->ChatPacket(CHAT_TYPE_INFO, "Ǹ忡 ߾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "Failed to enroll in a storefront.");
}
break;
}
@@ -1210,7 +1210,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
Wish.InsertItemInfo (item_info);
if (ch != NULL)
{
- ch->ChatPacket(CHAT_TYPE_INFO, "ϴٿ ߾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "Signed Up.");
}
break;
}
@@ -1218,7 +1218,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
{
if (ch != NULL)
{
- ch->ChatPacket(CHAT_TYPE_INFO, "ϴٿ ߾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "Failed to sign up.");
}
break;
}
@@ -1238,7 +1238,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
MyBid.Insert(new_item_info->bidder_id, new_item_info->item_id, new_item_info->get_bid_price());
if (ch != NULL)
{
- ch->ChatPacket(CHAT_TYPE_INFO, "߾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "You bid.");
}
}
break;
@@ -1254,7 +1254,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
memcpy (old_item_info, new_item_info, sizeof(TAuctionItemInfo));
if (ch != NULL)
{
- ch->ChatPacket(CHAT_TYPE_INFO, "ﱸ عȾ.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "I improvised.");
}
}
break;
@@ -1277,7 +1277,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
{
LPITEM item = ITEM_MANAGER::instance().CreateItem(player_item->vnum, player_item->count, item_id);
ch->AutoGiveItem (item, true);
- ch->ChatPacket(CHAT_TYPE_INFO, "Ծ.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "Imported.");
if (cmd == AUCTION_GET_AUC || cmd == AUCTION_CANCEL_AUC)
{
TPacketGDCommnadAuction pack_dai;
@@ -1337,7 +1337,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
}
else if (ch != NULL)
{
- ch->ChatPacket(CHAT_TYPE_INFO, "߾.");
+ ch->ChatPacket(CHAT_TYPE_INFO, "Canceled.");
}
}
break;
@@ -1354,7 +1354,7 @@ void AuctionManager::recv_result_auction (DWORD commander_id, TPacketDGResultAuc
}
else
{
- // insertϸ lock Ǯ.
+ // insert하면 lock이 풀린다.
DWORD item_id = cmd_result->target;
cmd_result++;
TAuctionItemInfo* auction_info = (TAuctionItemInfo*)cmd_result;
diff --git a/src/game/src/auction_manager.h b/src/game/src/auction_manager.h
index 598f3a8..73f710e 100644
--- a/src/game/src/auction_manager.h
+++ b/src/game/src/auction_manager.h
@@ -63,7 +63,7 @@ private:
TPCMap offer_map;
- // sorting members
+ // sorting을 위한 members
public:
typedef std::vector TItemInfoVec;
private:
@@ -76,7 +76,7 @@ private:
public:
void SortedItemInfos (TItemInfoVec& vec, BYTE grade, BYTE category, int start_idx, BYTE size, BYTE order[5]);
- // Լ.
+ // 나의 경매장을 위한 함수.
void YourItemInfoList (TItemInfoVec& vec, DWORD player_id, int start_idx, BYTE size);
};
@@ -131,7 +131,7 @@ private:
typedef std::pair BidInfo;
typedef std::map TItemMap;
typedef std::unordered_map TMyBidBoard;
- // bidder_id key
+ // bidder_id가 key
TMyBidBoard pc_map;
public:
@@ -144,7 +144,7 @@ public:
BidInfo GetMoney (DWORD player_id, DWORD item_id);
bool Delete (DWORD player_id, DWORD item_id);
- // ̹ .
+ // 이미 있으면 덮어 씌운다.
void Insert (DWORD player_id, DWORD item_id, int money);
void Lock (DWORD player_id, DWORD item_id);
void UnLock (DWORD player_id, DWORD item_id);
@@ -156,7 +156,7 @@ private :
typedef std::unordered_map