1
0
forked from metin2/server
server/game/src/locale_service.cpp

1335 lines
29 KiB
C++

#include "stdafx.h"
#include "locale_service.h"
#include "constants.h"
#include "banword.h"
#include "utils.h"
#include "mob_manager.h"
#include "empire_text_convert.h"
#include "config.h"
#include "skill_power.h"
using namespace std;
extern string g_stQuestDir;
extern set<string> g_setQuestObjectDir;
string g_stServiceName;
string g_stServiceBasePath = ".";
string g_stServiceMapPath = "data/map";
string g_stLocale = "euckr";
string g_stLocaleFilename;
BYTE PK_PROTECT_LEVEL = 30;
string g_stLocal = "";
eLocalization g_eLocalType = LC_NOSET;
int (*check_name) (const char * str) = NULL;
int (*is_twobyte) (const char * str) = NULL;
bool LC_InitLocalization( const std::string& szLocal );
int is_twobyte_gb2312(const char * str)
{
if (!str || !*str)
return 0;
BYTE b1 = str[0];
BYTE b2 = str[1];
if (!(b1 & 0x80))
return 0;
if (b1 < 0xb0 || b1 > 0xf7 || b2 < 0xa1 || b2 > 0xfe)
return 0;
return 1;
}
int is_twobyte_big5(const char * str)
{
if (!str || !*str)
return 0;
BYTE b1 = str[0];
BYTE b2 = str[1];
BYTE b[2];
b[0] = b2;
b[1] = b1;
WORD b12 = 0;
memcpy(&b12, b, 2);
if (!(b1 & 0x80))
return 0;
if ((b12 < 0xa440 || b12 > 0xc67e) && (b12 < 0xc940 || b12 > 0xf9d5))
{
if (test_server)
{
sys_log(0, "twobyte_big5 %x %x", b1, b2);
}
return 0;
}
return 1;
}
int check_name_independent(const char * str)
{
if (CBanwordManager::instance().CheckString(str, strlen(str)))
return 0;
// 몬스터 이름으로는 만들 수 없다.
char szTmp[256];
str_lower(str, szTmp, sizeof(szTmp));
if (CMobManager::instance().Get(szTmp, false))
return 0;
return 1;
}
int check_name_gb2312(const char * str)
{
static const BYTE exceptions[5][2] =
{
{ 0xd7, 0xfa },
{ 0xd7, 0xfb },
{ 0xd7, 0xfc },
{ 0xd7, 0xfd },
{ 0xd7, 0xfe }
};
int i, j;
BYTE b1, b2;
if (!str || !*str)
return 0;
i = 0;
size_t len = 0;
while (str[i])
{
if (str[i] & 0x80)
{
if (!str[i + 1])
return 0;
b1 = str[i++];
b2 = str[i++];
// 중국 간체는 첫번째 바이트 범위가 b0 -> f7 까지고
// 두번째 바이트 범위가 a1 -> fe 다.
if (b1 < 0xb0 || b1 > 0xf7 || b2 < 0xa1 || b2 > 0xfe)
return 0;
// 예외가 있다.
for (j = 0; j < 5; j++)
if (b1 == exceptions[j][0] && b2 == exceptions[j][1])
return 0;
len++;
}
else
{
if (!isdigit(str[i]) && !isalpha(str[i]))
return 0;
i++;
len++;
}
}
if ( len > 6 ) return 0;
return check_name_independent(str);
}
int check_name_big5(const char * str )
{
int i;
BYTE b1, b2;
if (!str || !*str)
return 0;
i = 0;
while (str[i])
{
if (str[i] & 0x80)
{
if (!str[i + 1])
return 0;
b1 = str[i++];
b2 = str[i++];
BYTE b[2];
b[0] = b2;
b[1] = b1;
// 중국 번체 ( big5 : 홍콩 )
// 범위는 다음과 같다.
// big5: 0xA140--0xF9D5
// extended big5: 0x40--0x7E and 0xA1--0xFE
// 0xa440-0xC67E
// 0xC940-0xF9D5
//
/*
Plan Code Range Description
1 A140H - A3E0H Symbol and Chinese Control Code
1 A440H - C67EH Commonly Used Characters
2 C940H - F9D5H Less Commonly Used Characters
UDF FA40H - FEFE User-Defined Characters
8E40H - A0FEH User-Defined Characters
8140H - 8DFEH User-Defined Characters
8181H - 8C82H User-Defined Characters
F9D6H - F9F1H User-Defined Characters
*/
WORD b12 = 0;
memcpy(&b12, b, 2);
if ((b12 < 0xa440 || b12 > 0xc67e) && (b12 < 0xc940 || b12 > 0xf9d5))
{
if (test_server)
sys_log(0, "check_name_big5[%d][%s] %x %x %x", i - 2, str, b1, b2, b12);
return 0;
}
}
else
{
if (!isdigit(str[i]) && !isalpha(str[i]))
return 0;
i++;
}
}
return check_name_independent(str);
}
int check_name_latin1(const char * str)
{
int code;
const char* tmp;
if (!str || !*str)
return 0;
if (strlen(str) < 2)
return 0;
for (tmp = str; *tmp; ++tmp)
{
// 한글이 아니고 빈칸이면 잘못된 것
if (isspace(*tmp))
return 0;
// 한글이 아니고 숫자라면 적합하다.
if (isdigit(*tmp))
continue;
// 한글이 아니고 영문이라면 적합하다.
if (isalpha(*tmp))
continue;
unsigned char uc_tmp = *tmp;
if (uc_tmp == 145 || uc_tmp == 146 || uc_tmp == 196
|| uc_tmp == 214 || uc_tmp == 220 || uc_tmp == 223
|| uc_tmp == 228 || uc_tmp == 246 || uc_tmp == 252 )
continue;
code = *tmp;
code += 256;
if (code < 176 || code > 200)
return 0;
++tmp;
if (!*tmp)
break;
}
return check_name_independent(str);
}
int check_name_alphabet(const char * str)
{
const char* tmp;
if (!str || !*str)
return 0;
if (strlen(str) < 2)
return 0;
for (tmp = str; *tmp; ++tmp)
{
// 알파벳과 수자만 허용
if (isdigit(*tmp) || isalpha(*tmp))
continue;
else
return 0;
}
return check_name_independent(str);
}
// DISABLE_SPECIAL_CHAR_NAMING
bool sjis_is_disable_name_char(const char* src)
{
static const char* sjis_symbols = "?";
if (strncmp(src, sjis_symbols, 2) == 0)
return true;
return false;
}
// END_OF_DISABLE_SPECIAL_CHAR_NAMING
//-----------------------------------------------
// CHECK SJIS STRING
//-----------------------------------------------
#define issjishead(c) ((0x81<=(c) && (c)<=0x9f) || \
((0xe0<=(c)) && (c)<=0xfc))
#define issjistail(c) ((0x40<=(c) && (c)<=0x7e) || \
(0x80<=(c) && (c)<=0xfc))
static int is_char_sjis(const char *p, const char *e)
{
return (issjishead((BYTE) *p) && (e-p)>1 && issjistail((BYTE)p[1]) ? true : false);
}
int is_twobyte_sjis(const char *str)
{
if (str && str[0] && str[1])
return issjishead((BYTE)str[0]) && issjistail((BYTE)str[1]);
else
return 0;
}
int check_name_sjis(const char *str)
{
const char *p = str;
const char *e = str + strlen(str); // NULL position
// 일본은 캐릭터 이름길이 16byte 까지
if ( strlen(str) < 2 || strlen(str) > 16 )
return 0;
while (*p)
{
if (is_char_sjis(p, e))
{
// DISABLE_SPECIAL_CHAR_NAMING
if (sjis_is_disable_name_char(p))
return false;
// END_OF_DISABLE_SPECIAL_CHAR_NAMING
// 이문자는 허용되지 않는다.
if ((BYTE)p[0]==0x81 && (BYTE)p[1]==0x40) return false;
p += 2;
continue;
}
else
{
// 영문이나 수자는 허용한다.
if (isalpha(*p) || isdigit(*p))
{
p += 1;
continue;
}
else
{
return 0;
}
}
}
return check_name_independent(str);
}
//-----------------------------------------------
// END OF CHECK SJIS STRING
//-----------------------------------------------
void LocaleService_LoadLocaleStringFile()
{
if (g_stLocaleFilename.empty())
return;
if (g_bAuthServer)
return;
fprintf(stderr, "LocaleService %s\n", g_stLocaleFilename.c_str());
locale_init(g_stLocaleFilename.c_str());
}
void LocaleService_LoadEmpireTextConvertTables()
{
char szFileName[256];
for (int iEmpire = 1; iEmpire <= 3; ++iEmpire)
{
snprintf(szFileName, sizeof(szFileName), "%s/lang%d.cvt", LocaleService_GetBasePath().c_str(), iEmpire);
sys_log(0, "Load %s", szFileName);
LoadEmpireTextConvertTable(iEmpire, szFileName);
}
}
static void __LocaleService_Init_DEFAULT()
{
g_stLocaleFilename = "";
g_stServiceBasePath = "locale/" + g_stServiceName;
g_stServiceMapPath = g_stServiceBasePath + "/map";
g_stQuestDir = g_stServiceBasePath + "/quest";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert(g_stQuestDir + "/object");
}
static void __LocaleService_Init_JAPAN()
{
g_stLocale = "sjis";
g_stServiceBasePath = "locale/japan";
g_stQuestDir = "locale/japan/quest";
g_stServiceMapPath = "locale/japan/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/japan/quest/object");
g_stLocaleFilename = "locale/japan/sjis_string.txt";
g_iUseLocale = true;
check_name = check_name_sjis;
is_twobyte = is_twobyte_sjis;
exp_table = exp_table_euckr;
}
static void __LocaleService_Init_English()
{
g_stLocale = "latin1";
g_stServiceBasePath = "locale/english";
g_stQuestDir = "locale/english/quest";
g_stServiceMapPath = "locale/english/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/english/quest/object");
g_stLocaleFilename = "locale/english/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
}
static void __LocaleService_Init_HongKong()
{
g_stLocale = "big5";
g_stServiceBasePath = "locale/hongkong";
g_stQuestDir = "locale/hongkong/quest";
g_stServiceMapPath = "locale/hongkong/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/hongkong/quest/object");
g_stLocaleFilename = "locale/hongkong/big5_string.txt";
g_iUseLocale = true;
check_name = check_name_big5;
is_twobyte = is_twobyte_big5;
}
static void __LocaleService_Init_NewCIBN()
{
g_stLocale = "gb2312";
g_stServiceBasePath = "locale/newcibn";
g_stQuestDir = "locale/newcibn/quest";
g_stServiceMapPath = "locale/newcibn/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/newcibn/quest/object");
g_stLocaleFilename = "locale/newcibn/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_gb2312;
is_twobyte = is_twobyte_gb2312;
//exp_table = exp_table_newcibn;
}
static void __LocaleService_Init_Germany()
{
g_stLocale="latin1";
g_stServiceBasePath = "locale/germany";
g_stQuestDir = "locale/germany/quest";
g_stServiceMapPath = "locale/germany/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/germany/quest/object");
g_stLocaleFilename = "locale/germany/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Korea()
{
g_stLocale="euckr";
g_stServiceBasePath = "locale/korea";
g_stQuestDir = "locale/korea/quest";
g_stServiceMapPath = "locale/korea/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/korea/quest/object");
g_iUseLocale = true;
exp_table = exp_table_euckr;
}
static void __LocaleService_Init_France()
{
g_stLocale="latin1";
g_stServiceBasePath = "locale/france";
g_stQuestDir = "locale/france/quest";
g_stServiceMapPath = "locale/france/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/france/quest/object");
g_stLocaleFilename = "locale/france/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Italy()
{
g_stLocale="latin1";
g_stServiceBasePath = "locale/italy";
g_stQuestDir = "locale/italy/quest";
g_stServiceMapPath = "locale/italy/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/italy/quest/object");
g_stLocaleFilename = "locale/italy/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_spain()
{
g_stLocale="latin1";
g_stServiceBasePath = "locale/spain";
g_stQuestDir = "locale/spain/quest";
g_stServiceMapPath = "locale/spain/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/spain/quest/object");
g_stLocaleFilename = "locale/spain/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_greek()
{
g_stLocale="greek";
g_stServiceBasePath = "locale/greek";
g_stQuestDir = "locale/greek/quest";
g_stServiceMapPath = "locale/greek/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/greek/quest/object");
g_stLocaleFilename = "locale/greek/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_UK()
{
g_stLocale="latin1";
g_stServiceBasePath = "locale/uk";
g_stQuestDir = "locale/uk/quest";
g_stServiceMapPath = "locale/uk/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/uk/quest/object");
g_stLocaleFilename = "locale/uk/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Turkey()
{
g_stLocale="latin5";
g_stServiceBasePath = "locale/turkey";
g_stQuestDir = "locale/turkey/quest";
g_stServiceMapPath = "locale/turkey/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/turkey/quest/object");
g_stLocaleFilename = "locale/turkey/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Poland()
{
g_stLocale="latin2";
g_stServiceBasePath = "locale/poland";
g_stQuestDir = "locale/poland/quest";
g_stServiceMapPath = "locale/poland/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/poland/quest/object");
g_stLocaleFilename = "locale/poland/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Portugal()
{
g_stLocale="latin1";
g_stServiceBasePath = "locale/portugal";
g_stQuestDir = "locale/portugal/quest";
g_stServiceMapPath = "locale/portugal/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/portugal/quest/object");
g_stLocaleFilename = "locale/portugal/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Canada()
{
g_stLocale = "latin1";
g_stServiceBasePath = "locale/canada";
g_stQuestDir = "locale/canada/quest";
g_stServiceMapPath = "locale/canada/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/canada/quest/object");
g_stLocaleFilename = "locale/canada/locale_string.txt";
check_name = check_name_alphabet;
g_iUseLocale = true;
}
static void __LocaleService_Init_Brazil()
{
g_stLocale = "latin1";
g_stServiceBasePath = "locale/brazil";
g_stQuestDir = "locale/brazil/quest";
g_stServiceMapPath = "locale/brazil/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/brazil/quest/object");
g_stLocaleFilename = "locale/brazil/locale_string.txt";
check_name = check_name_alphabet;
g_iUseLocale = true;
}
static void __LocaleService_Init_YMIR()
{
g_stLocaleFilename = "";
g_stServiceBasePath = "locale/" + g_stServiceName;
g_stServiceMapPath = g_stServiceBasePath + "/map";
g_stQuestDir = g_stServiceBasePath + "/quest";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert(g_stQuestDir + "/object");
PK_PROTECT_LEVEL = 30;
exp_table = exp_table_euckr;
}
static void __LocaleService_Init_Russia()
{
g_stLocale="cp1251";
g_stServiceBasePath = "locale/russia";
g_stQuestDir = "locale/russia/quest";
g_stServiceMapPath = "locale/russia/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/russia/quest/object");
g_stLocaleFilename = "locale/russia/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Denmark()
{
g_stLocale="latin1";
g_stServiceBasePath = "locale/denmark";
g_stQuestDir = "locale/denmark/quest";
g_stServiceMapPath = "locale/denmark/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/denmark/quest/object");
g_stLocaleFilename = "locale/denmark/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Bulgaria()
{
g_stLocale="cp1251";
g_stServiceBasePath = "locale/bulgaria";
g_stQuestDir = "locale/bulgaria/quest";
g_stServiceMapPath = "locale/bulgaria/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/bulgaria/quest/object");
g_stLocaleFilename = "locale/bulgaria/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Croatia()
{
g_stLocale="cp1251";
g_stServiceBasePath = "locale/croatia";
g_stQuestDir = "locale/croatia/quest";
g_stServiceMapPath = "locale/croatia/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/croatia/quest/object");
g_stLocaleFilename = "locale/croatia/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Mexico()
{
g_stLocale="latin1";
g_stServiceBasePath = "locale/mexico";
g_stQuestDir = "locale/mexico/quest";
g_stServiceMapPath = "locale/mexico/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/mexico/quest/object");
g_stLocaleFilename = "locale/mexico/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Arabia()
{
g_stLocale="cp1256";
g_stServiceBasePath = "locale/arabia";
g_stQuestDir = "locale/arabia/quest";
g_stServiceMapPath = "locale/arabia/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/arabia/quest/object");
g_stLocaleFilename = "locale/arabia/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Czech()
{
g_stLocale="latin2";
g_stServiceBasePath = "locale/czech";
g_stQuestDir = "locale/czech/quest";
g_stServiceMapPath = "locale/czech/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/czech/quest/object");
g_stLocaleFilename = "locale/czech/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Hungary()
{
g_stLocale="latin2";
g_stServiceBasePath = "locale/hungary";
g_stQuestDir = "locale/hungary/quest";
g_stServiceMapPath = "locale/hungary/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/hungary/quest/object");
g_stLocaleFilename = "locale/hungary/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Romania()
{
g_stLocale="latin2";
g_stServiceBasePath = "locale/romania";
g_stQuestDir = "locale/romania/quest";
g_stServiceMapPath = "locale/romania/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/romania/quest/object");
g_stLocaleFilename = "locale/romania/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Netherlands()
{
g_stLocale="latin1";
g_stServiceBasePath = "locale/netherlands";
g_stQuestDir = "locale/netherlands/quest";
g_stServiceMapPath = "locale/netherlands/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/netherlands/quest/object");
g_stLocaleFilename = "locale/netherlands/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Singapore()
{
g_stLocale = "latin1";
g_stServiceBasePath = "locale/singapore";
g_stQuestDir = "locale/singapore/quest";
g_stServiceMapPath = "locale/singapore/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/singapore/quest/object");
g_stLocaleFilename = "locale/singapore/locale_string.txt";
check_name = check_name_alphabet;
g_iUseLocale = true;
//exp_table = exp_table_newcibn; 2013 09 11 CYH europe 과 동일하게 간다.
}
static void __LocaleService_Init_Vietnam()
{
g_stLocale = "latin1";
g_stServiceBasePath = "locale/vietnam";
g_stQuestDir = "locale/vietnam/quest";
g_stServiceMapPath = "locale/vietnam/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/vietnam/quest/object");
g_stLocaleFilename = "locale/vietnam/locale_string.txt";
check_name = check_name_alphabet;
g_iUseLocale = true;
exp_table = exp_table_newcibn;
}
static void __LocaleService_Init_Thailand()
{
g_stLocale = "latin1";
g_stServiceBasePath = "locale/thailand";
g_stQuestDir = "locale/thailand/quest";
g_stServiceMapPath = "locale/thailand/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/thailand/quest/object");
g_stLocaleFilename = "locale/thailand/locale_string.txt";
check_name = check_name_alphabet;
g_iUseLocale = true;
}
static void __LocaleService_Init_USA()
{
g_stLocale = "latin1";
g_stServiceBasePath = "locale/usa";
g_stQuestDir = "locale/usa/quest";
g_stServiceMapPath = "locale/usa/map";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert("locale/usa/quest/object");
g_stLocaleFilename = "locale/usa/locale_string.txt";
g_iUseLocale = true;
check_name = check_name_alphabet;
}
// World Edition version for korea
static void __LocaleService_Init_WE_Korea()
{
g_stLocale = "euckr";
// g_stLocaleFilename = "locale/we_korea/locale_string.txt";
g_stServiceBasePath = "locale/" + g_stServiceName;
g_stServiceMapPath = g_stServiceBasePath + "/map";
g_stQuestDir = g_stServiceBasePath + "/quest";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert(g_stQuestDir + "/object");
g_iUseLocale = true;
PK_PROTECT_LEVEL = 15;
}
static void __LocaleService_Init_Taiwan()
{
g_stLocale = "big5";
g_stServiceBasePath = "locale/" + g_stServiceName;
g_stServiceMapPath = g_stServiceBasePath + "/map";
g_stQuestDir = g_stServiceBasePath + "/quest";
g_setQuestObjectDir.clear();
g_setQuestObjectDir.insert(g_stQuestDir + "/object");
g_stLocaleFilename = "locale/taiwan/locale_string.txt";
check_name = check_name_big5;
is_twobyte = is_twobyte_big5;
g_iUseLocale = true;
PK_PROTECT_LEVEL = 15;
}
static void __CheckPlayerSlot(const std::string& service_name)
{
if (PLAYER_PER_ACCOUNT != 4)
{
printf("<ERROR> PLAYER_PER_ACCOUNT = %d\n", PLAYER_PER_ACCOUNT);
exit(0);
}
}
bool LocaleService_Init(const std::string& c_rstServiceName)
{
if (!g_stServiceName.empty())
{
sys_err("ALREADY exist service");
return false;
}
g_stServiceName = c_rstServiceName;
if ( "japan" == g_stServiceName)
{
__LocaleService_Init_JAPAN();
}
else if ( "english" == g_stServiceName)
{
__LocaleService_Init_English();
}
else if ( "hongkong" == g_stServiceName)
{
__LocaleService_Init_HongKong();
}
else if ( "newcibn" == g_stServiceName)
{
__LocaleService_Init_NewCIBN();
}
else if ( "germany" == g_stServiceName)
{
__LocaleService_Init_Germany();
}
else if ( "korea" == g_stServiceName)
{
__LocaleService_Init_Korea();
}
else if ( "france" == g_stServiceName)
{
__LocaleService_Init_France();
}
else if ( "italy" == g_stServiceName)
{
__LocaleService_Init_Italy();
}
else if ( "spain" == g_stServiceName)
{
__LocaleService_Init_spain();
}
else if ( "greek" == g_stServiceName)
{
__LocaleService_Init_greek();
}
else if ( "uk" == g_stServiceName)
{
__LocaleService_Init_UK();
}
else if ( "turkey" == g_stServiceName)
{
__LocaleService_Init_Turkey();
}
else if ( "poland" == g_stServiceName)
{
__LocaleService_Init_Poland();
}
else if ( "portugal" == g_stServiceName)
{
__LocaleService_Init_Portugal();
}
else if ( "canada" == g_stServiceName)
{
__LocaleService_Init_Canada();
}
else if ( "brazil" == g_stServiceName)
{
__LocaleService_Init_Brazil();
}
else if ( "ymir" == g_stServiceName)
{
__LocaleService_Init_YMIR();
}
else if ( "russia" == g_stServiceName)
{
__LocaleService_Init_Russia();
}
else if ( "denmark" == g_stServiceName)
{
__LocaleService_Init_Denmark();
}
else if ( "bulgaria" == g_stServiceName)
{
__LocaleService_Init_Bulgaria();
}
else if ( "croatia" == g_stServiceName)
{
__LocaleService_Init_Croatia();
}
else if ( "mexico" == g_stServiceName)
{
__LocaleService_Init_Mexico();
}
else if ( "arabia" == g_stServiceName)
{
__LocaleService_Init_Arabia();
}
else if ( "czech" == g_stServiceName)
{
__LocaleService_Init_Czech();
}
else if ( "romania" == g_stServiceName)
{
__LocaleService_Init_Romania();
}
else if ( "hungary" == g_stServiceName)
{
__LocaleService_Init_Hungary();
}
else if ( "netherlands" == g_stServiceName)
{
__LocaleService_Init_Netherlands();
}
else if ( "singapore" == g_stServiceName)
{
__LocaleService_Init_Singapore();
}
else if ( "vietnam" == g_stServiceName)
{
__LocaleService_Init_Vietnam();
}
else if ( "thailand" == g_stServiceName)
{
__LocaleService_Init_Thailand();
}
else if ("usa" == g_stServiceName)
{
__LocaleService_Init_USA();
}
else if ("we_korea" == g_stServiceName)
{
__LocaleService_Init_WE_Korea(); // ver.World Edition for korea
}
else if ("taiwan" == g_stServiceName)
{
__LocaleService_Init_Taiwan();
}
else
{
__LocaleService_Init_DEFAULT();
}
fprintf(stdout, "Setting Locale \"%s\" (Path: %s)\n", g_stServiceName.c_str(), g_stServiceBasePath.c_str());
__CheckPlayerSlot(g_stServiceName);
if (false == LC_InitLocalization(c_rstServiceName))
return false;
return true;
}
void LocaleService_TransferDefaultSetting()
{
if (!check_name)
check_name = check_name_independent;
if (!is_twobyte)
is_twobyte = is_twobyte_gb2312;
if (!exp_table)
exp_table = exp_table_common;
if (!CTableBySkill::instance().Check())
exit(1);
if (!aiPercentByDeltaLevForBoss)
aiPercentByDeltaLevForBoss = aiPercentByDeltaLevForBoss_euckr;
if (!aiPercentByDeltaLev)
aiPercentByDeltaLev = aiPercentByDeltaLev_euckr;
if (!aiChainLightningCountBySkillLevel)
aiChainLightningCountBySkillLevel = aiChainLightningCountBySkillLevel_euckr;
}
const std::string& LocaleService_GetBasePath()
{
return g_stServiceBasePath;
}
const std::string& LocaleService_GetMapPath()
{
return g_stServiceMapPath;
}
const std::string& LocaleService_GetQuestPath()
{
return g_stQuestDir;
}
bool LC_InitLocalization( const std::string& szLocal )
{
g_stLocal = szLocal;
if ( !g_stLocal.compare("ymir") )
g_eLocalType = LC_YMIR;
else if ( !g_stLocal.compare("japan") )
g_eLocalType = LC_JAPAN;
else if ( !g_stLocal.compare("english") )
g_eLocalType = LC_ENGLISH;
else if ( !g_stLocal.compare("hongkong") )
g_eLocalType = LC_HONGKONG;
else if (!g_stLocal.compare("newcibn") )
g_eLocalType = LC_NEWCIBN;
else if ( !g_stLocal.compare("germany") )
g_eLocalType = LC_GERMANY;
else if ( !g_stLocal.compare("korea") )
g_eLocalType = LC_KOREA;
else if ( !g_stLocal.compare("france") )
g_eLocalType = LC_FRANCE;
else if ( !g_stLocal.compare("italy") )
g_eLocalType = LC_ITALY;
else if ( !g_stLocal.compare("spain") )
g_eLocalType = LC_SPAIN;
else if ( !g_stLocal.compare("greek") )
g_eLocalType = LC_GREEK;
else if ( !g_stLocal.compare("uk") )
g_eLocalType = LC_UK;
else if ( !g_stLocal.compare("turkey") )
g_eLocalType = LC_TURKEY;
else if ( !g_stLocal.compare("poland") )
g_eLocalType = LC_POLAND;
else if ( !g_stLocal.compare("portugal") )
g_eLocalType = LC_PORTUGAL;
else if ( !g_stLocal.compare("canada") )
g_eLocalType = LC_CANADA;
else if ( !g_stLocal.compare("brazil") )
g_eLocalType = LC_BRAZIL;
else if ( !g_stLocal.compare("russia") )
g_eLocalType = LC_RUSSIA;
else if ( !g_stLocal.compare("denmark") )
g_eLocalType = LC_DENMARK;
else if ( !g_stLocal.compare("bulgaria") )
g_eLocalType = LC_BULGARIA;
else if ( !g_stLocal.compare("croatia") )
g_eLocalType = LC_CROATIA;
else if ( !g_stLocal.compare("mexico") )
g_eLocalType = LC_MEXICO;
else if ( !g_stLocal.compare("arabia") )
g_eLocalType = LC_ARABIA;
else if ( !g_stLocal.compare("czech") )
g_eLocalType = LC_CZECH;
else if ( !g_stLocal.compare("romania") )
g_eLocalType = LC_ROMANIA;
else if ( !g_stLocal.compare("hungary") )
g_eLocalType = LC_HUNGARY;
else if ( !g_stLocal.compare("netherlands") )
g_eLocalType = LC_NETHERLANDS;
else if ( !g_stLocal.compare("singapore") )
g_eLocalType = LC_SINGAPORE;
else if ( !g_stLocal.compare("vietnam") )
g_eLocalType = LC_VIETNAM;
else if ( !g_stLocal.compare("thailand") )
g_eLocalType = LC_THAILAND;
else if ( !g_stLocal.compare("usa") )
g_eLocalType = LC_USA;
else if ( !g_stLocal.compare("we_korea") ) // ver.WorldEdition for korea
g_eLocalType = LC_WE_KOREA;
else if ( !g_stLocal.compare("taiwan") )
g_eLocalType = LC_TAIWAN;
else
return false;
return true;
}
eLocalization LC_GetLocalType()
{
return g_eLocalType;
}
bool LC_IsLocale( const eLocalization t )
{
return LC_GetLocalType() == t ? true : false;
}
bool LC_IsYMIR() { return LC_GetLocalType() == LC_YMIR ? true : false; }
bool LC_IsJapan() { return LC_GetLocalType() == LC_JAPAN ? true : false; }
bool LC_IsEnglish() { return LC_GetLocalType() == LC_ENGLISH ? true : false; }
bool LC_IsHongKong() { return LC_GetLocalType() == LC_HONGKONG ? true : false; }
bool LC_IsNewCIBN() { return LC_GetLocalType() == LC_NEWCIBN ? true : false; }
bool LC_IsGermany() { return LC_GetLocalType() == LC_GERMANY ? true : false; }
bool LC_IsKorea() { return LC_GetLocalType() == LC_KOREA ? true : false; }
bool LC_IsCanada() { return LC_GetLocalType() == LC_CANADA ? false : false; }
bool LC_IsBrazil() { return LC_GetLocalType() == LC_BRAZIL ? true : false; }
bool LC_IsSingapore() { return LC_GetLocalType() == LC_SINGAPORE ? true : false; }
bool LC_IsVietnam() { return LC_GetLocalType() == LC_VIETNAM ? true : false; }
bool LC_IsThailand() { return LC_GetLocalType() == LC_THAILAND ? true : false; }
bool LC_IsWE_Korea() { return LC_GetLocalType() == LC_WE_KOREA ? true : false; }
bool LC_IsTaiwan() { return LC_GetLocalType() == LC_TAIWAN ? true : false; }
bool LC_IsWorldEdition()
{
return LC_IsWE_Korea() || LC_IsEurope();
}
bool LC_IsEurope()
{
eLocalization val = LC_GetLocalType();
switch ((int) val)
{
case LC_ENGLISH:
case LC_GERMANY:
case LC_FRANCE:
case LC_ITALY:
case LC_TURKEY:
case LC_POLAND:
case LC_UK:
case LC_SPAIN:
case LC_PORTUGAL:
case LC_GREEK:
case LC_RUSSIA:
case LC_DENMARK:
case LC_BULGARIA:
case LC_CROATIA:
case LC_MEXICO: // 남미지만 GF에서 서비스 하므로 여기 넣음
case LC_ARABIA: // 중동이지만 GF에서 서비스 하므로 여기 넣음
case LC_CZECH:
case LC_ROMANIA:
case LC_HUNGARY:
case LC_NETHERLANDS:
case LC_USA:
case LC_WE_KOREA: // 한국이지만 UK 버전 기반이므로 여기 넣음
case LC_TAIWAN: // 대만이지만 WE_KOREA 버전 기반이므로 여기 넣음
case LC_JAPAN: // 일본이지만 WE(World Edition -_-) 버전이므로 여기 넣음
case LC_NEWCIBN:
case LC_CANADA: // 캐나다 GF에서 서비스 시작
return true;
}
return false;
}