client/UserInterface/Locale.cpp

441 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "Locale.h"
#include "PythonApplication.h"
#include "resource.h"
#include "../eterBase/CRC32.h"
#include "../eterpack/EterPackManager.h"
#include "../eterLocale/Japanese.h"
#include <windowsx.h>
const char* LSS_YMIR = "YMIR";
const char* LSS_JAPAN = "JAPAN";
const char* LSS_ENGLISH = "ENGLISH";
const char* LSS_HONGKONG = "HONGKONG";
const char* LSS_TAIWAN = "TAIWAN";
const char* LSS_NEWCIBN = "NEWCIBN";
const char* LSS_EUROPE = "EUROPE";
const char* LSS_GLOBAL = "GLOBAL";
static bool IS_CHEONMA = false;
#ifndef LSS_SECURITY_KEY
#define LSS_SECURITY_KEY "testtesttesttest"
#endif
std::string __SECURITY_KEY_STRING__ = LSS_SECURITY_KEY;
char MULTI_LOCALE_SERVICE[256] = "YMIR";
char MULTI_LOCALE_PATH[256] = "locale/ymir";
char MULTI_LOCALE_NAME[256] = "ymir";
int MULTI_LOCALE_CODE = 949;
int MULTI_LOCALE_REPORT_PORT = 10000;
void LocaleService_LoadConfig(const char* fileName)
{
NANOBEGIN
FILE* fp = fopen(fileName, "rt");
if (fp)
{
char line[256];
char name[256];
int code;
int id;
if (fgets(line, sizeof(line)-1, fp))
{
line[sizeof(line)-1] = '\0';
sscanf(line, "%d %d %s", &id, &code, name);
MULTI_LOCALE_REPORT_PORT = id;
MULTI_LOCALE_CODE = code;
strcpy(MULTI_LOCALE_NAME, name);
sprintf(MULTI_LOCALE_PATH, "locale/%s", MULTI_LOCALE_NAME);
}
fclose(fp);
}
NANOEND
}
unsigned LocaleService_GetLastExp(int level)
{
static const int GUILD_LEVEL_MAX = 20;
if (LocaleService_IsCHEONMA())
{
static DWORD CHEONMA_GUILDEXP_LIST[GUILD_LEVEL_MAX+1] =
{
0, // 0
15000ul, // 1
45000ul, // 2
90000ul, // 3
160000ul, // 4
235000ul, // 5
325000ul, // 6
430000ul, // 7
550000ul, // 8
685000ul, // 9
835000ul, // 10
1000000ul, // 11
1500000ul, // 12
2100000ul, // 13
2800000ul, // 14
3600000ul, // 15
4500000ul, // 16
6500000ul, // 17
8000000ul, // 18
10000000ul, // 19
42000000UL // 20
};
if (level < 0 && level >= GUILD_LEVEL_MAX)
return 0;
return CHEONMA_GUILDEXP_LIST[level];
}
static DWORD INTERNATIONAL_GUILDEXP_LIST[GUILD_LEVEL_MAX+1] =
{
0, // 0
6000UL, // 1
18000UL, // 2
36000UL, // 3
64000UL, // 4
94000UL, // 5
130000UL, // 6
172000UL, // 7
220000UL, // 8
274000UL, // 9
334000UL, // 10
400000UL, // 11
600000UL, // 12
840000UL, // 13
1120000UL, // 14
1440000UL, // 15
1800000UL, // 16
2600000UL, // 17
3200000UL, // 18
4000000UL, // 19
16800000UL // 20
};
if (level < 0 && level >= GUILD_LEVEL_MAX)
return 0;
return INTERNATIONAL_GUILDEXP_LIST[level];
}
int LocaleService_GetSkillPower(unsigned level)
{
static const unsigned SKILL_POWER_NUM = 50;
if (level >= SKILL_POWER_NUM)
return 0;
if (LocaleService_IsCHEONMA())
{
static unsigned CHEONMA_SKILL_POWERS[SKILL_POWER_NUM]=
{
0,
5, 7, 9, 11, 13,
15, 17, 19, 20, 22,
24, 26, 28, 30, 32,
34, 36, 38, 40, 50, // master
52, 55, 58, 61, 63,
66, 69, 72, 75, 80, // grand_master
82, 84, 87, 90, 95,
100,110,120,130,150,// perfect_master
150,
};
return CHEONMA_SKILL_POWERS[level];
}
// 0 5 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 50 52 54 56 58 60 63 66 69 72 82 85 88 91 94 98 102 106 110 115 125 125 125 125 125
static unsigned INTERNATIONAL_SKILL_POWERS[SKILL_POWER_NUM]=
{
0,
5, 6, 8, 10, 12,
14, 16, 18, 20, 22,
24, 26, 28, 30, 32,
34, 36, 38, 40, 50, // master
52, 54, 56, 58, 60,
63, 66, 69, 72, 82, // grand_master
85, 88, 91, 94, 98,
102,106,110,115,125,// perfect_master
125,
};
return INTERNATIONAL_SKILL_POWERS[level];
}
const char* LocaleService_GetSecurityKey()
{
return __SECURITY_KEY_STRING__.c_str();
}
// CHEONMA
void LocaleService_SetCHEONMA(bool isEnable)
{
IS_CHEONMA = isEnable;
}
bool LocaleService_IsCHEONMA()
{
return LocaleService_IsYMIR();
}
// END_OF_CHEONMA
#if defined(LOCALE_SERVICE_EUROPE) || defined(LOCALE_SERVICE_BRAZIL) || defined(LOCALE_SERVICE_CANADA) || defined(LOCALE_SERVICE_SINGAPORE) || defined(LOCALE_SERVICE_VIETNAM) || defined(LOCALE_SERVICE_TAIWAN) || defined(LOCALE_SERVICE_NEWCIBN)
#define _LSS_USE_LOCALE_CFG 1
#define _LSS_SERVICE_NAME LSS_EUROPE
#elif defined(LOCALE_SERVICE_ITALY)
#define _LSS_SERVICE_NAME LSS_ITALY
#define _LSS_SERVICE_CODEPAGE CP_LATIN
#define _LSS_SERVICE_LOCALE_NAME "it"
#define _LSS_SERVICE_LOCALE_PATH "locale/it"
#elif defined(LOCALE_SERVICE_ENGLISH)
#define _LSS_SERVICE_NAME LSS_ENGLISH
#define _LSS_SERVICE_CODEPAGE CP_LATIN
#define _LSS_SERVICE_LOCALE_NAME "english"
#define _LSS_SERVICE_LOCALE_PATH "locale/english"
#elif defined(LOCALE_SERVICE_JAPAN)
#define _LSS_SERVICE_NAME LSS_JAPAN
#define _LSS_SERVICE_CODEPAGE CP_JAPANESE
#define _LSS_SERVICE_LOCALE_NAME "japan"
#define _LSS_SERVICE_LOCALE_PATH "locale/japan"
#elif defined(LOCALE_SERVICE_YMIR)
#define _LSS_SERVICE_NAME LSS_YMIR
#define _LSS_SERVICE_CODEPAGE CP_HANGUL
#define _LSS_SERVICE_LOCALE_NAME "ymir"
#define _LSS_SERVICE_LOCALE_PATH "locale/ymir"
#elif defined(LOCALE_SERVICE_HONGKONG)
#define _LSS_SERVICE_NAME LSS_HONGKONG
#define _LSS_SERVICE_CODEPAGE CP_CHINESE_TRAD
#define _LSS_SERVICE_LOCALE_NAME "hongkong"
#define _LSS_SERVICE_LOCALE_PATH "locale/hongkong"
#elif defined(LOCALE_SERVICE_TAIWAN)
#define _LSS_SERVICE_NAME LSS_TAIWAN
#define _LSS_SERVICE_CODEPAGE CP_CHINESE_TRAD
#define _LSS_SERVICE_LOCALE_NAME "taiwan"
#define _LSS_SERVICE_LOCALE_PATH "locale/taiwan"
#elif defined(LOCALE_SERVICE_NEWCIBN)
#define _LSS_SERVICE_NAME LSS_NEWCIBN
#define _LSS_SERVICE_CODEPAGE CP_CHINESE_SIMPLE
#define _LSS_SERVICE_LOCALE_NAME "newcibn"
#define _LSS_SERVICE_LOCALE_PATH "locale/newcibn"
#endif
#if defined(_LSS_USE_LOCALE_CFG)
#if defined(_LSS_SERVICE_NAME)
const char* LocaleService_GetName() { return _LSS_SERVICE_NAME;}
#else
const char* LocaleService_GetName() { return MULTI_LOCALE_SERVICE; }
#endif
unsigned int LocaleService_GetCodePage() { return MULTI_LOCALE_CODE; }
const char* LocaleService_GetLocaleName() { return MULTI_LOCALE_NAME; }
const char* LocaleService_GetLocalePath() { return MULTI_LOCALE_PATH; }
#elif defined(_LSS_SERVICE_NAME)
const char* LocaleService_GetName() { return _LSS_SERVICE_NAME;}
unsigned int LocaleService_GetCodePage() { return _LSS_SERVICE_CODEPAGE; }
const char* LocaleService_GetLocaleName() { return _LSS_SERVICE_LOCALE_NAME; }
const char* LocaleService_GetLocalePath() { return _LSS_SERVICE_LOCALE_PATH; }
#endif
void LocaleService_ForceSetLocale(const char* name, const char* localePath)
{
strcpy(MULTI_LOCALE_NAME, name);
strcpy(MULTI_LOCALE_PATH, localePath);
// <20><><EFBFBD><EFBFBD> õ<><C3B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽÿ<D3BD><C3BF><EFBFBD> security key <20><><EFBFBD><EFBFBD> (WE <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> õ<><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>)
if (0 == stricmp(name, "ymir"))
__SECURITY_KEY_STRING__ = "testtesttesttest";
if (0 == stricmp(name, "we_korea"))
__SECURITY_KEY_STRING__ = "1234abcd5678efgh";
}
#if defined(LOCALE_SERVICE_GLOBAL)
struct SLOCALEDATA
{
const char* szServiceName;
const char* szLocaleName;
WORD wCodePage;
const char* szSecurityKey;
} gs_stLocaleData[] = {
{ LSS_YMIR, "ymir", 949, "testtesttesttest" }, // Korea
{ LSS_EUROPE, "de", 1252, "1234abcd5678efgh" }, // GameForge (Germany)
{ LSS_EUROPE, "en", 1252, "1234abcd5678efgh" }, // GameForge (United Kingdom)
{ LSS_EUROPE, "us", 1252, "1234abcd5678efgh" }, // GameForge (USA)
{ LSS_EUROPE, "es", 1252, "1234abcd5678efgh" }, // GameForge (Spain)
{ LSS_EUROPE, "it", 1252, "1234abcd5678efgh" }, // GameForge (Italy)
{ LSS_EUROPE, "fr", 1252, "1234abcd5678efgh" }, // GameForge (France)
{ LSS_EUROPE, "pt", 1252, "1234abcd5678efgh" }, // GameForge (Portugal)
{ LSS_EUROPE, "tr", 1253, "1234abcd5678efgh" }, // GameForge (Greece)
{ LSS_EUROPE, "pl", 1250, "1234abcd5678efgh" }, // GameForge (Poland)
{ LSS_EUROPE, "tr", 1254, "1234abcd5678efgh" }, // GameForge (Turkey)
{ LSS_EUROPE, "dk", 1252, "1234abcd5678efgh" }, // GameForge (Demmark)
{ LSS_EUROPE, "ae", 1256, "1234abcd5678efgh" }, // GameForge (United Arab Emirate)
{ LSS_EUROPE, "mx", 1252, "1234abcd5678efgh" }, // GameForge (Mexico)
{ LSS_EUROPE, "nl", 1252, "1234abcd5678efgh" }, // GameForge (Netherlands)
{ LSS_EUROPE, "cz", 1252, "1234abcd5678efgh" }, // GameForge (Czech Republic)
{ LSS_EUROPE, "ru", 1251, "1234abcd5678efgh" }, // GameForge (Russian Federation)
{ LSS_EUROPE, "hu", 1250, "1234abcd5678efgh" }, // GameForge (Hungary)
{ LSS_EUROPE, "ro", 1250, "1234abcd5678efgh" }, // GameForge (Romania)
{ LSS_EUROPE, "ca", 1252, "testtesttesttest" }, // Z8Games (Canada)
{ LSS_EUROPE, "sg", 1252, "testtesttesttest" }, // TEC (Singapore)
{ LSS_JAPAN, "japan", 932, "testtesttesttest" }, // Japan
{ LSS_EUROPE, "br", 1252, "testtesttesttest" }, // OnGame (Brazil)
{ LSS_HONGKONG, "hongkong", 950, "testtesttesttest" }, // HongKong & Taiwan
{ LSS_NEWCIBN, "newcibn", 936, "testtesttesttest" }, // CIBN (Free world)
{ LSS_ENGLISH, "english", 949, "testtesttesttest" }, // English (Obsoleted)
{ LSS_YMIR, "kr", 949, "testtesttesttest" }, // Korea (Obsoleted)
{ NULL, NULL, 0, "testtesttesttest" }
};
const char* LocaleService_GetName()
{
return MULTI_LOCALE_SERVICE;
}
unsigned int LocaleService_GetCodePage()
{
return MULTI_LOCALE_CODE;
}
const char* LocaleService_GetLocaleName()
{
return MULTI_LOCALE_NAME;
}
const char* LocaleService_GetLocalePath()
{
return MULTI_LOCALE_PATH;
}
static int gs_iLocale = -1;
LRESULT CALLBACK SelectDlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg ) {
case WM_INITDIALOG : {
char szLocalePath[256], szDisplayName[256];
for(int i=0; gs_stLocaleData[i].szServiceName; i++ ) {
sprintf(szLocalePath, "locale/%s/item_proto", gs_stLocaleData[i].szLocaleName);
if( CEterPackManager::Instance().isExist(szLocalePath)) {
sprintf(szDisplayName, "%s (%s, %d)", gs_stLocaleData[i].szLocaleName, gs_stLocaleData[i].szServiceName, gs_stLocaleData[i].wCodePage);
int iIndex = ListBox_AddString(GetDlgItem(hDlg, IDC_LOCALE_LIST), szDisplayName);
ListBox_SetItemData(GetDlgItem(hDlg, IDC_LOCALE_LIST), iIndex, i);
}
}
return TRUE;
}
case WM_COMMAND :
switch( LOWORD( wParam ) ) {
case IDC_LOCALE_LIST: {
int iSelected = ListBox_GetCurSel(GetDlgItem(hDlg, IDC_LOCALE_LIST));
switch(HIWORD(wParam)) {
case LBN_SELCHANGE :
gs_iLocale = ListBox_GetItemData(GetDlgItem(hDlg, IDC_LOCALE_LIST), iSelected);
break;
case LBN_DBLCLK :
gs_iLocale = ListBox_GetItemData(GetDlgItem(hDlg, IDC_LOCALE_LIST), iSelected);
::EndDialog(hDlg, 0);
break;
}
break;
}
case IDC_START: {
::EndDialog(hDlg, 0);
break;
}
case IDC_EXIT: {
gs_iLocale = -1;
::EndDialog(hDlg, 0);
break;
}
}
return FALSE;
}
return FALSE;
}
bool LocaleService_LoadGlobal(HINSTANCE hInstance)
{
int nFoundLocales = 0;
char szLocalePath[256];
for(int i=0; gs_stLocaleData[i].szServiceName; i++ ) {
sprintf(szLocalePath, "locale/%s/item_proto", gs_stLocaleData[i].szLocaleName);
if( CEterPackManager::Instance().isExist(szLocalePath)) {
nFoundLocales++;
if(gs_iLocale == -1)
gs_iLocale = i;
}
}
if (gs_iLocale < 0)
return false;
if(nFoundLocales > 1)
::DialogBox(hInstance, MAKEINTRESOURCE(IDD_SELECT_LOCALE), NULL, (DLGPROC) SelectDlgProc);
if (gs_iLocale < 0)
return false;
strcpy(MULTI_LOCALE_SERVICE, gs_stLocaleData[gs_iLocale].szServiceName);
strcpy(MULTI_LOCALE_NAME, gs_stLocaleData[gs_iLocale].szLocaleName);
sprintf(MULTI_LOCALE_PATH, "locale/%s", gs_stLocaleData[gs_iLocale].szLocaleName);
MULTI_LOCALE_CODE = gs_stLocaleData[gs_iLocale].wCodePage;
if(gs_stLocaleData[gs_iLocale].szSecurityKey)
__SECURITY_KEY_STRING__ = gs_stLocaleData[gs_iLocale].szSecurityKey;
return true;
}
#else
bool LocaleService_LoadGlobal(HINSTANCE hInstance)
{
return false;
}
#endif
bool LocaleService_IsYMIR() { return (stricmp( LocaleService_GetName(), LSS_YMIR ) == 0) || (stricmp( LocaleService_GetLocaleName(), "ymir" ) == 0); }
bool LocaleService_IsJAPAN() { return (stricmp( LocaleService_GetName(), LSS_JAPAN ) == 0) || (stricmp( LocaleService_GetLocaleName(), "japan" ) == 0); }
bool LocaleService_IsENGLISH() { return (stricmp( LocaleService_GetName(), LSS_ENGLISH ) == 0); }
bool LocaleService_IsEUROPE() { return (stricmp( LocaleService_GetName(), LSS_EUROPE ) == 0); }
bool LocaleService_IsHONGKONG() { return (stricmp( LocaleService_GetName(), LSS_HONGKONG ) == 0); }
bool LocaleService_IsTAIWAN() { return (stricmp( LocaleService_GetName(), LSS_TAIWAN ) == 0); }
bool LocaleService_IsNEWCIBN() { return (stricmp( LocaleService_GetName(), LSS_NEWCIBN ) == 0); }
#if defined(LOCALE_SERVICE_WE_JAPAN)
BOOL LocaleService_IsLeadByte( const char chByte )
{
return ShiftJIS_IsLeadByte( chByte );
}
int LocaleService_StringCompareCI( LPCSTR szStringLeft, LPCSTR szStringRight, size_t sizeLength )
{
return ShiftJIS_StringCompareCI( szStringLeft, szStringRight, sizeLength );
}
#else
BOOL LocaleService_IsLeadByte( const char chByte )
{
return (((unsigned char) chByte) & 0x80) != 0;
}
int LocaleService_StringCompareCI( LPCSTR szStringLeft, LPCSTR szStringRight, size_t sizeLength )
{
return strnicmp( szStringLeft, szStringRight, sizeLength );
}
#endif
#ifdef USE_OPENID
std::string __OPENID_AUTH_KEY_STRING__;
int openid_test = 0;
void LocaleService_SetOpenIDAuthKey(const char *authKey)
{
__OPENID_AUTH_KEY_STRING__ = authKey;
return;
}
const char* LocaleService_GetOpenIDAuthKey()
{
return __OPENID_AUTH_KEY_STRING__.c_str();
}
#endif /* USE_OPENID */