Jump to content

Save Account System


Recommended Posts

M2 Download Center

This is the hidden content, please
( Internal )

Spoiler

172914Immagine.png.671f47d6a3e25201df714


Extract root and open intrologin.py
At the beginning add:

import os
from _winreg import *


Search:

self.loginExitButton        = GetObject("LoginExitButton")


Add:

            self.saveLoginButton        = GetObject("SaveLoginButton")
            self.loadCredentialButton    = GetObject("LoadCredentials")


Finally at the end add:
 

def ICDev_ECRYPT(self,data):
        Data = ''
        for l in data:
            Data = Data+str(int(ord(l) + 2) * 2)+' '
        return Data

    def ICDev_DECRYPT(self,data):
        Data = ''
        data = data.split()
        for l in data:
            Data = Data+chr((int(l) / 2) - 2)
        return Data
 
    def __OnClickSaveLoginButton(self):
        id = self.idEditLine.GetText()
        pwd = self.pwdEditLine.GetText()
        if (len(id) != 0 and len(pwd) != 0):
            if not os.path.exists("SOFTWARE\ICDev"):
                key = CreateKey(HKEY_CURRENT_USER,"SOFTWARE\ICDev")
            SetValueEx(key, "UserID", 0, REG_SZ, self.ICDev_ECRYPT(id))
            SetValueEx(key, "Passwd", 0, REG_SZ, self.ICDev_ECRYPT(pwd))
            CloseKey(key)
            self.PopupNotifyMessage("Datele au fost salvate!",self.SetIDEditLineFocus)
 
 
    def __OnClickLoadInfoButton(self):
        try:
            key = OpenKey(HKEY_CURRENT_USER, "SOFTWARE\ICDev", 0, KEY_ALL_ACCESS)
            self.Connect(self.ICDev_DECRYPT(QueryValueEx(key, "UserID")[0]),self.ICDev_DECRYPT(QueryValueEx(key, "Passwd")[0]))
        except:
            self.PopupNotifyMessage("Nu exista nici un account salvat!",self.SetIDEditLineFocus)


Extract locale_xx and open loginwindow.py
Search:
 

"text" : uiScriptLocale.LOGIN_CONNECT,
                },
            ),
        },

Add: 

        ## userDataBoard
        {
            "name" : "UserDataBoard",
            "type" : "thinboard",

            "x" : (SCREEN_WIDTH - 208) / 2,
            "y" : (SCREEN_HEIGHT - 355),
            "width" : 205,
            "height" : 55,

            "children" :
            (
                {
                    "name" : "SaveLoginButton",
                    "type" : "button",

                    "x" : 10,
                    "y" : 0,
                    "vertical_align" : "center",
                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",
                   
                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",

                    "text" : uiScriptLocale.LOGIN_SAVE_BUTTON,
                },
                {
                    "name" : "LoadCredentials",
                    "type" : "button",

                    "x" : 105,
                    "y" : 0,
                    "vertical_align" : "center",
                    "default_image" : "d:/ymir work/ui/public/large_button_01.sub",
                   
                    "over_image" : "d:/ymir work/ui/public/large_button_02.sub",
                    "down_image" : "d:/ymir work/ui/public/large_button_03.sub",

                    "text" : uiScriptLocale.LOGIN_LOAD_BUTTON,
                },
            ),
        },

In local_interface.txt (local_xx) add:

LOGIN_SAVE_BUTTON Save 
LOGIN_LOAD_BUTTON Load 

Now add in YourClient/lib: 

This is the hidden content, please

  • Metin2 Dev 122
  • kekw 3
  • Eyes 2
  • Dislove 1
  • Angry 3
  • Not Good 1
  • Smile Tear 2
  • Think 2
  • Confused 2
  • Scream 1
  • Good 48
  • Love 5
  • Love 68
Link to comment
Share on other sites

  • 2 weeks later...
  • 2 weeks later...

i have the error:

1126 11:28:00353 ::   File "
1126 11:28:00353 :: introLogin.py
1126 11:28:00353 :: ", line
1126 11:28:00353 :: 1376
1126 11:28:00353 ::

1126 11:28:00353 ::     
1126 11:28:00353 :: Data = ''

1126 11:28:00353 ::     
1126 11:28:00353 ::  
1126 11:28:00353 ::  
1126 11:28:00353 ::  
1126 11:28:00353 :: ^

1126 11:28:00353 :: IndentationError
1126 11:28:00353 :: :
1126 11:28:00353 :: expected an indented block
1126 11:28:00353 ::

 

Link to comment
Share on other sites

  • 3 months later...
  • 1 year later...
  • 2 years later...
  • Contributor
2 hours ago, Historia said:

I did all the copy & paste stuff. But dont know where do I put the winreg.pyc data? 

Now the Client shut downs, I did put the winreg in filezilla usr/home/game/quest..

why did you put it on serverside, when it is a clientside thing?

Anyway put it to the lib folder clientside (or even root should work).

Edited by TMP4
Link to comment
Share on other sites

  • 1 month later...
  • 2 weeks later...
0306 07:25:00721 :: Traceback (most recent call last):

0306 07:25:00721 ::   File "introLogo.py", line 60, in OnUpdate

0306 07:25:00721 ::   File "networkModule.py", line 177, in SetLoginPhase

0306 07:25:00721 ::   File "system.py", line 130, in __pack_import

0306 07:25:00721 ::   File "
0306 07:25:00721 :: <string>
0306 07:25:00721 :: ", line 
0306 07:25:00721 :: 530
0306 07:25:00722 :: 

0306 07:25:00722 ::     
0306 07:25:00722 :: self.saveLoginButton        = GetObject("SaveLoginButton")

0306 07:25:00722 ::     
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00722 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00723 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00724 ::  
0306 07:25:00725 ::  
0306 07:25:00725 ::  
0306 07:25:00725 ::  
0306 07:25:00725 ::  
0306 07:25:00725 ::  
0306 07:25:00725 ::  
0306 07:25:00725 :: ^

0306 07:25:00725 :: IndentationError
0306 07:25:00725 :: : 
0306 07:25:00725 :: unindent does not match any outer indentation level
0306 07:25:00725 :: 

I have blackscreen and this says my client syserr.txt

 

Link to comment
Share on other sites

  • 1 month later...

 With tabs, working for me.

Spoiler

spacer.png

Extract root and open intrologin.py
At the beginning add:

import os
from _winreg import *


Search:

self.loginExitButton		= GetObject("LoginExitButton")


Add:

			self.saveLoginButton		= GetObject("SaveLoginButton")
			self.loadCredentialButton	= GetObject("LoadCredentials")

 

Search

self.pwdEditLine.SetTabEvent(ui.__mem_func__(self.idEditLine.SetFocus))

Add:

self.saveLoginButton.SetEvent(ui.__mem_func__(self.__OnClickSaveLoginButton))
self.loadCredentialButton.SetEvent(ui.__mem_func__(self.__OnClickLoadInfoButton))


Finally at the end add:
 

	def ICDev_ECRYPT(self,data):
		Data = ''
		for l in data:
			Data = Data+str(int(ord(l) + 2) * 2)+' '
		return Data

	def ICDev_DECRYPT(self,data):
		Data = ''
		data = data.split()
		for l in data:
			Data = Data+chr((int(l) / 2) - 2)
		return Data
 
	def __OnClickSaveLoginButton(self):
		id = self.idEditLine.GetText()
		pwd = self.pwdEditLine.GetText()
		if (len(id) != 0 and len(pwd) != 0):
			if not os.path.exists("SOFTWARE\ICDev"):
				key = CreateKey(HKEY_CURRENT_USER,"SOFTWARE\ICDev")
			SetValueEx(key, "UserID", 0, REG_SZ, self.ICDev_ECRYPT(id))
			SetValueEx(key, "Passwd", 0, REG_SZ, self.ICDev_ECRYPT(pwd))
			CloseKey(key)
			self.PopupNotifyMessage("Saved successfully.",self.SetIDEditLineFocus)
            
	def __OnClickLoadInfoButton(self):
		try:
			key = OpenKey(HKEY_CURRENT_USER, "SOFTWARE\ICDev", 0, KEY_ALL_ACCESS)
			self.Connect(self.ICDev_DECRYPT(QueryValueEx(key, "UserID")[0]),self.ICDev_DECRYPT(QueryValueEx(key, "Passwd")[0]))
		except:
			self.PopupNotifyMessage("Save before load.",self.SetIDEditLineFocus)


Extract locale_xx and open loginwindow.py
Search:
 

					"text" : uiScriptLocale.LOGIN_EXIT,
				},
			),
		},

Add: 

		## userDataBoard
		{
			"name" : "UserDataBoard",
			"type" : "thinboard",

			"x" : (SCREEN_WIDTH - 208) / 2,
			"y" : (SCREEN_HEIGHT - 410 - 70),
			"width" : 208,
			"height" : 35,

			"children" :
			(
				{
					"name" : "SaveLoginButton",
					"type" : "button",

					"x" : 10,
					"y" : 0,
					"vertical_align" : "center",
					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
				   
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",

					"text" : uiScriptLocale.LOGIN_SAVE_BUTTON,
				},
				{
					"name" : "LoadCredentials",
					"type" : "button",

					"x" : 105,
					"y" : 0,
					"vertical_align" : "center",
					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
				   
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",

					"text" : uiScriptLocale.LOGIN_LOAD_BUTTON,
				},
			),
		},

In local_interface.txt (local_xx) add:

LOGIN_SAVE_BUTTON	Save
LOGIN_LOAD_BUTTON	Load
Edited by Metin2 Dev
Core X - External 2 Internal
Link to comment
Share on other sites

  • 1 month later...

Hello i have this problem please help me
 

0609 20:19:00880 :: 
introLogin.py(line:533) __LoadScript
ui.py(line:2704) GetChild

LoginWindow.__LoadScript.BindObject - <type 'exceptions.KeyError'>:'SaveLoginButton'

0609 20:19:00880 :: ============================================================================================================
0609 20:19:00880 :: Abort!!!!
 

Link to comment
Share on other sites

  • 2 years later...

hi, sorry for the late message here, if its a problem, forgive me, but i have a problem with the fliege v3 client/files,

after i add all the code and the "winreg" file in root.eix/epk i got following error: 

0624 00:26:00478 :: Failed to load script file : locale/de/ui/LoginWindow.py
0624 00:26:00479 :: 
ui.py(line:3690) LoadScriptFile
system.py(line:193) execfile
system.py(line:164) Run
locale/de/ui/LoginWindow.py(line:645) <module>

LoadScriptFile!!!!!!!!!!!!!! - <type 'exceptions.NameError'>:name 'uiScriptLocale' is not defined

0624 00:26:00479 :: ============================================================================================================
0624 00:26:00479 :: Abort!!!!


0624 00:26:00479 :: 
introLogin.py(line:468) __LoadScript
ui.py(line:3707) LoadScriptFile
exception.py(line:36) Abort

LoginWindow.__LoadScript.LoadObject - <type 'exceptions.SystemExit'>:

0624 00:26:00479 :: ============================================================================================================
0624 00:26:00479 :: Abort!!!!


0624 00:26:00489 :: ============================================================================================================
0624 00:26:00489 :: Abort!!!!

here are my changed files

intrologin.py:

Spoiler
import dbg
import app
import net
import ui
import ime
import snd
import wndMgr
import musicInfo
import serverInfo
import systemSetting
import ServerStateChecker
import localeInfo
import constInfo
import uiCommon
import time
import serverCommandParser
import ime
import uiScriptLocale
import uiGuild
import sys
import uiTarget
import os
from _winreg import *

RUNUP_MATRIX_AUTH = FALSE
NEWCIBN_PASSPOD_AUTH = FALSE

LOGIN_DELAY_SEC = 0.0
SKIP_LOGIN_PHASE = FALSE
SKIP_LOGIN_PHASE_SUPPORT_CHANNEL = FALSE
FULL_BACK_IMAGE = FALSE

PASSPOD_MSG_DICT = {}

VIRTUAL_KEYBOARD_NUM_KEYS = 46
VIRTUAL_KEYBOARD_RAND_KEY = TRUE

def Suffle(src):
	if VIRTUAL_KEYBOARD_RAND_KEY:
		items = [item for item in src]

		itemCount = len(items)
		for oldPos in xrange(itemCount):
			newPos = app.GetRandom(0, itemCount-1)
			items[newPos], items[oldPos] = items[oldPos], items[newPos]

		return "".join(items)
	else:
		return src

def IsFullBackImage():
	global FULL_BACK_IMAGE
	return FULL_BACK_IMAGE

def IsLoginDelay():
	global LOGIN_DELAY_SEC
	if LOGIN_DELAY_SEC > 0.0:
		return TRUE
	else:
		return FALSE

def IsRunupMatrixAuth():
	global RUNUP_MATRIX_AUTH
	return RUNUP_MATRIX_AUTH	

def IsNEWCIBNPassPodAuth():
	global NEWCIBN_PASSPOD_AUTH
	return NEWCIBN_PASSPOD_AUTH

def GetLoginDelay():
	global LOGIN_DELAY_SEC
	return LOGIN_DELAY_SEC

app.SetGuildMarkPath("test")

class ConnectingDialog(ui.ScriptWindow):

	def __init__(self):
		ui.ScriptWindow.__init__(self)
		self.__LoadDialog()
		self.eventTimeOver = lambda *arg: None
		self.eventExit = lambda *arg: None

	def __del__(self):
		ui.ScriptWindow.__del__(self)

	def __LoadDialog(self):
		try:
			PythonScriptLoader = ui.PythonScriptLoader()
			PythonScriptLoader.LoadScriptFile(self, "UIScript/ConnectingDialog.py")

			self.board = self.GetChild("board")
			self.message = self.GetChild("message")
			self.countdownMessage = self.GetChild("countdown_message")

		except:
			import exception
			exception.Abort("ConnectingDialog.LoadDialog.BindObject")

	def Open(self, waitTime):
		curTime = time.clock()
		self.endTime = curTime + waitTime

		self.Lock()
		self.SetCenterPosition()
		self.SetTop()
		self.Show()		

	def Close(self):
		self.Unlock()
		self.Hide()

	def Destroy(self):
		self.Hide()
		self.ClearDictionary()

	def SetText(self, text):
		self.message.SetText(text)

	def SetCountDownMessage(self, waitTime):
		self.countdownMessage.SetText("%.0f%s" % (waitTime, localeInfo.SECOND))

	def SAFE_SetTimeOverEvent(self, event):
		self.eventTimeOver = ui.__mem_func__(event)

	def SAFE_SetExitEvent(self, event):
		self.eventExit = ui.__mem_func__(event)

	def OnUpdate(self):
		lastTime = max(0, self.endTime - time.clock())
		if 0 == lastTime:
			self.Close()
			self.eventTimeOver()
		else:
			self.SetCountDownMessage(self.endTime - time.clock())

	def OnPressExitKey(self):
		#self.eventExit()
		return TRUE

class LoginWindow(ui.ScriptWindow):

	IS_TEST = net.IsTest()

	def __init__(self, stream):
		print "NEW LOGIN WINDOW  ----------------------------------------------------------------------------"
		ui.ScriptWindow.__init__(self)
		net.SetPhaseWindow(net.PHASE_WINDOW_LOGIN, self)
		net.SetAccountConnectorHandler(self)

		self.matrixInputChanceCount = 0
		self.lastLoginTime = 0
		self.inputDialog = None
		self.connectingDialog = None
		self.stream=stream
		self.isNowCountDown=FALSE
		self.isStartError=FALSE

		self.xServerBoard = 0
		self.yServerBoard = 0
		
		self.loadingImage = None

		self.virtualKeyboard = None
		self.virtualKeyboardMode = "ALPHABET"
		self.virtualKeyboardIsUpper = FALSE
		
	def __del__(self):
		net.ClearPhaseWindow(net.PHASE_WINDOW_LOGIN, self)
		net.SetAccountConnectorHandler(0)
		ui.ScriptWindow.__del__(self)
		print "---------------------------------------------------------------------------- DELETE LOGIN WINDOW"

	def Open(self):
		ServerStateChecker.Create(self)

		print "LOGIN WINDOW OPEN ----------------------------------------------------------------------------"

		self.loginFailureMsgDict={
			#"DEFAULT" : localeInfo.LOGIN_FAILURE_UNKNOWN,
			"ALREADY"	: localeInfo.LOGIN_FAILURE_ALREAY,
			"NOID"		: localeInfo.LOGIN_FAILURE_NOT_EXIST_ID,
			"WRONGPWD"	: localeInfo.LOGIN_FAILURE_WRONG_PASSWORD,
			"FULL"		: localeInfo.LOGIN_FAILURE_TOO_MANY_USER,
			"SHUTDOWN"	: localeInfo.LOGIN_FAILURE_SHUTDOWN,
			"REPAIR"	: localeInfo.LOGIN_FAILURE_REPAIR_ID,
			"BLOCK"		: localeInfo.LOGIN_FAILURE_BLOCK_ID,
			"WRONGMAT"	: localeInfo.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER,
			"QUIT"		: localeInfo.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER_TRIPLE,
			"BESAMEKEY"	: localeInfo.LOGIN_FAILURE_BE_SAME_KEY,
			"NOTAVAIL"	: localeInfo.LOGIN_FAILURE_NOT_AVAIL,
			"NOBILL"	: localeInfo.LOGIN_FAILURE_NOBILL,
			"BLKLOGIN"	: localeInfo.LOGIN_FAILURE_BLOCK_LOGIN,
			"WEBBLK"	: localeInfo.LOGIN_FAILURE_WEB_BLOCK,
			"BADSCLID"	: localeInfo.LOGIN_FAILURE_WRONG_SOCIALID,
			"AGELIMIT"	: localeInfo.LOGIN_FAILURE_SHUTDOWN_TIME,
			"WRONGVER"	: localeInfo.LOGIN_FAILURE_WRONG_VERSION,
		}

		self.loginFailureFuncDict = {
			"WRONGPWD"	: self.__DisconnectAndInputPassword,
			"WRONGMAT"	: self.__DisconnectAndInputMatrix,
			"QUIT"		: app.Exit,
			"WRONGVER"	: app.Exit,
		}

		self.SetSize(wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight())
		self.SetWindowName("LoginWindow")

		if not self.__LoadScript(uiScriptLocale.LOCALE_UISCRIPT_PATH + "LoginWindow.py"):
			dbg.TraceError("LoginWindow.Open - __LoadScript Error")
			return
		
		self.__LoadLoginInfo("loginInfo.xml")
		
		if app.loggined:
			self.loginFailureFuncDict = {
			"WRONGPWD"	: app.Exit,
			"WRONGMAT"	: app.Exit,
			"QUIT"		: app.Exit,
			}

		if musicInfo.loginMusic != "":
			snd.SetMusicVolume(systemSetting.GetMusicVolume())
			snd.FadeInMusic("bgm/"+musicInfo.loginMusic)

		snd.SetSoundVolume(systemSetting.GetSoundVolume())

		# pevent key "[" "]"
		ime.AddExceptKey(91)
		ime.AddExceptKey(93)
			
		self.Show()

		global SKIP_LOGIN_PHASE
		if SKIP_LOGIN_PHASE:
			if self.isStartError:
				self.connectBoard.Hide()
				self.loginBoard.Hide()
				self.serverBoard.Hide()
				self.PopupNotifyMessage(localeInfo.LOGIN_CONNECT_FAILURE, self.__ExitGame)
				return

			if self.loginInfo:
				self.serverBoard.Hide()
			else:
				self.__RefreshServerList()
				self.__OpenServerBoard()
		else:
			connectingIP = self.stream.GetConnectAddr()
			if connectingIP:
				self.__OpenLoginBoard()
				if IsFullBackImage():
					self.GetChild("bg1").Hide()
					self.GetChild("bg2").Show()

			else:
				self.__RefreshServerList()
				self.__OpenServerBoard()

		app.ShowCursor()

	def Close(self):

		if self.connectingDialog:
			self.connectingDialog.Close()
		self.connectingDialog = None

		ServerStateChecker.Initialize(self)

		print "---------------------------------------------------------------------------- CLOSE LOGIN WINDOW "

		if musicInfo.loginMusic != "" and musicInfo.selectMusic != "":
			snd.FadeOutMusic("bgm/"+musicInfo.loginMusic)

		self.idEditLine.SetTabEvent(0)
		self.idEditLine.SetReturnEvent(0)
		self.pwdEditLine.SetReturnEvent(0)
		self.pwdEditLine.SetTabEvent(0)

		self.connectBoard = None
		self.loginBoard = None
		self.idEditLine = None
		self.pwdEditLine = None
		self.inputDialog = None
		self.connectingDialog = None
		self.loadingImage = None

		self.serverBoard				= None
		self.serverList					= None
		self.channelList				= None

		# RUNUP_MATRIX_AUTH
		self.matrixQuizBoard	= None
		self.matrixAnswerInput	= None
		self.matrixAnswerOK	= None
		self.matrixAnswerCancel	= None
		# RUNUP_MATRIX_AUTH_END

		# NEWCIBN_PASSPOD_AUTH
		self.passpodBoard	= None
		self.passpodAnswerInput	= None
		self.passpodAnswerOK	= None
		self.passpodAnswerCancel = None
		# NEWCIBN_PASSPOD_AUTH_END

		self.VIRTUAL_KEY_ALPHABET_LOWERS = None
		self.VIRTUAL_KEY_ALPHABET_UPPERS = None
		self.VIRTUAL_KEY_SYMBOLS = None
		self.VIRTUAL_KEY_NUMBERS = None

		# VIRTUAL_KEYBOARD_BUG_FIX
		if self.virtualKeyboard:
			for keyIndex in xrange(0, VIRTUAL_KEYBOARD_NUM_KEYS+1):
				key = self.GetChild2("key_%d" % keyIndex)
				if key:
					key.SetEvent(None)

			self.GetChild("key_space").SetEvent(None)
			self.GetChild("key_backspace").SetEvent(None)
			self.GetChild("key_enter").SetEvent(None)
			self.GetChild("key_shift").SetToggleDownEvent(None)
			self.GetChild("key_shift").SetToggleUpEvent(None)
			self.GetChild("key_at").SetToggleDownEvent(None)
			self.GetChild("key_at").SetToggleUpEvent(None)

			self.virtualKeyboard = None

		self.KillFocus()
		self.Hide()

		self.stream.popupWindow.Close()
		self.loginFailureFuncDict=None

		ime.ClearExceptKey()

		app.HideCursor()

	def __SaveChannelInfo(self):
		try:
			file=open("channel.inf", "w")
			file.write("%d %d %d" % (self.__GetServerID(), self.__GetChannelID(), self.__GetRegionID()))
		except:
			print "LoginWindow.__SaveChannelInfo - SaveError"

	def __LoadChannelInfo(self):
		try:
			file=open("channel.inf")
			lines=file.readlines()
			
			if len(lines)>0:
				tokens=lines[0].split()

				selServerID=int(tokens[0])
				selChannelID=int(tokens[1])
				
				if len(tokens) == 3:
					regionID = int(tokens[2])

				return regionID, selServerID, selChannelID

		except:
			print "LoginWindow.__LoadChannelInfo - OpenError"
			return -1, -1, -1

	def __ExitGame(self):
		app.Exit()

	def SetIDEditLineFocus(self):
		if self.idEditLine != None:
			self.idEditLine.SetFocus()

	def SetPasswordEditLineFocus(self):
		if self.pwdEditLine != None:
			self.pwdEditLine.SetFocus()

	def OnEndCountDown(self):
		self.isNowCountDown = FALSE
		self.timeOutMsg = FALSE
		self.OnConnectFailure()

	def OnConnectFailure(self):

		if self.isNowCountDown:
			return

		snd.PlaySound("sound/ui/loginfail.wav")

		if self.connectingDialog:
			self.connectingDialog.Close()
		self.connectingDialog = None

		if app.loggined:
			self.PopupNotifyMessage(localeInfo.LOGIN_CONNECT_FAILURE, self.__ExitGame)
		else:
			self.PopupNotifyMessage(localeInfo.LOGIN_CONNECT_FAILURE, self.SetPasswordEditLineFocus)

	def OnHandShake(self):
		if not IsLoginDelay():
			snd.PlaySound("sound/ui/loginok.wav")
			self.PopupDisplayMessage(localeInfo.LOGIN_CONNECT_SUCCESS)

	def OnLoginStart(self):
		if not IsLoginDelay():
			self.PopupDisplayMessage(localeInfo.LOGIN_PROCESSING)

	def OnLoginFailure(self, error):
		if self.connectingDialog:
			self.connectingDialog.Close()
		self.connectingDialog = None

		try:
			loginFailureMsg = self.loginFailureMsgDict[error]
		except KeyError:
			if PASSPOD_MSG_DICT:
				try:
					loginFailureMsg = PASSPOD_MSG_DICT[error]
				except KeyError:
					loginFailureMsg = localeInfo.LOGIN_FAILURE_UNKNOWN + error
			else:
				loginFailureMsg = localeInfo.LOGIN_FAILURE_UNKNOWN  + error


		#0000685: [M2EU] 아이디/비밀번호 유추 가능 버그 수정: 무조건 패스워드로 포커스가 가게 만든다
		loginFailureFunc=self.loginFailureFuncDict.get(error, self.SetPasswordEditLineFocus)

		if app.loggined:
			self.PopupNotifyMessage(loginFailureMsg, self.__ExitGame)
		else:
			self.PopupNotifyMessage(loginFailureMsg, loginFailureFunc)

		snd.PlaySound("sound/ui/loginfail.wav")

	def __DisconnectAndInputID(self):
		if self.connectingDialog:
			self.connectingDialog.Close()
		self.connectingDialog = None

		self.SetIDEditLineFocus()
		net.Disconnect()

	def __DisconnectAndInputPassword(self):
		if self.connectingDialog:
			self.connectingDialog.Close()
		self.connectingDialog = None

		self.SetPasswordEditLineFocus()
		net.Disconnect()

	def __DisconnectAndInputMatrix(self):
		if self.connectingDialog:
			self.connectingDialog.Close()
		self.connectingDialog = None

		self.stream.popupWindow.Close()
		self.matrixInputChanceCount -= 1

		if self.matrixInputChanceCount <= 0:
			self.__OnCloseInputDialog()

		elif self.inputDialog:
			self.inputDialog.Show()

	def __LoadScript(self, fileName):
		import dbg
		try:
			pyScrLoader = ui.PythonScriptLoader()
			pyScrLoader.LoadScriptFile(self, fileName)
		except:
			import exception
			exception.Abort("LoginWindow.__LoadScript.LoadObject")
		try:
			GetObject=self.GetChild
			self.serverBoard			= GetObject("ServerBoard")
			self.serverList				= GetObject("ServerList")
			self.channelList			= GetObject("ChannelList")
			self.serverSelectButton		= GetObject("ServerSelectButton")
			self.serverExitButton		= GetObject("ServerExitButton")
			self.connectBoard			= GetObject("ConnectBoard")
			self.loginBoard				= GetObject("LoginBoard")
			self.idEditLine				= GetObject("ID_EditLine")
			self.pwdEditLine			= GetObject("Password_EditLine")
			self.serverInfo				= GetObject("ConnectName")
			self.selectConnectButton	= GetObject("SelectConnectButton")
			self.loginButton			= GetObject("LoginButton")
			self.loginExitButton		= GetObject("LoginExitButton")
			self.saveLoginButton		= GetObject("SaveLoginButton")
			self.loadCredentialButton	= GetObject("LoadCredentials")

			# RUNUP_MATRIX_AUTH
			if IsRunupMatrixAuth():
				self.matrixQuizBoard	= GetObject("RunupMatrixQuizBoard")
				self.matrixAnswerInput	= GetObject("RunupMatrixAnswerInput")
				self.matrixAnswerOK	= GetObject("RunupMatrixAnswerOK")
				self.matrixAnswerCancel	= GetObject("RunupMatrixAnswerCancel")
			# RUNUP_MATRIX_AUTH_END

			# NEWCIBN_PASSPOD_AUTH
			if IsNEWCIBNPassPodAuth():
				self.passpodBoard	= GetObject("NEWCIBN_PASSPOD_BOARD")
				self.passpodAnswerInput	= GetObject("NEWCIBN_PASSPOD_INPUT")
				self.passpodAnswerOK	= GetObject("NEWCIBN_PASSPOD_OK")
				self.passpodAnswerCancel= GetObject("NEWCIBN_PASSPOD_CANCEL")
			# NEWCIBN_PASSPOD_AUTH_END

			self.virtualKeyboard		= self.GetChild2("VirtualKeyboard")

			if self.virtualKeyboard:
				self.VIRTUAL_KEY_ALPHABET_UPPERS = Suffle(localeInfo.VIRTUAL_KEY_ALPHABET_UPPERS)
				self.VIRTUAL_KEY_ALPHABET_LOWERS = "".join([localeInfo.VIRTUAL_KEY_ALPHABET_LOWERS[localeInfo.VIRTUAL_KEY_ALPHABET_UPPERS.index(e)] for e in self.VIRTUAL_KEY_ALPHABET_UPPERS])
				self.VIRTUAL_KEY_SYMBOLS = Suffle(localeInfo.VIRTUAL_KEY_SYMBOLS)
				self.VIRTUAL_KEY_NUMBERS = Suffle(localeInfo.VIRTUAL_KEY_NUMBERS)
				self.__VirtualKeyboard_SetAlphabetMode()
			
				self.GetChild("key_space").SetEvent(lambda : self.__VirtualKeyboard_PressKey(' '))
				self.GetChild("key_backspace").SetEvent(lambda : self.__VirtualKeyboard_PressBackspace())
				self.GetChild("key_enter").SetEvent(lambda : self.__VirtualKeyboard_PressReturn())
				self.GetChild("key_shift").SetToggleDownEvent(lambda : self.__VirtualKeyboard_SetUpperMode())
				self.GetChild("key_shift").SetToggleUpEvent(lambda : self.__VirtualKeyboard_SetLowerMode())
				self.GetChild("key_at").SetToggleDownEvent(lambda : self.__VirtualKeyboard_SetSymbolMode())
				self.GetChild("key_at").SetToggleUpEvent(lambda : self.__VirtualKeyboard_SetAlphabetMode())

		except:
			import exception
			exception.Abort("LoginWindow.__LoadScript.BindObject")

		if self.IS_TEST:
			self.selectConnectButton.Hide()
		else:
			self.selectConnectButton.SetEvent(ui.__mem_func__(self.__OnClickSelectConnectButton))

		self.serverBoard.OnKeyUp = ui.__mem_func__(self.__ServerBoard_OnKeyUp)
		self.xServerBoard, self.yServerBoard = self.serverBoard.GetLocalPosition()

		self.serverSelectButton.SetEvent(ui.__mem_func__(self.__OnClickSelectServerButton))
		self.serverExitButton.SetEvent(ui.__mem_func__(self.__OnClickExitButton))

		self.loginButton.SetEvent(ui.__mem_func__(self.__OnClickLoginButton))
		self.loginExitButton.SetEvent(ui.__mem_func__(self.__OnClickExitButton))

		self.serverList.SetEvent(ui.__mem_func__(self.__OnSelectServer))
		
		self.idEditLine.SetReturnEvent(ui.__mem_func__(self.pwdEditLine.SetFocus))
		self.idEditLine.SetTabEvent(ui.__mem_func__(self.pwdEditLine.SetFocus))

		self.pwdEditLine.SetReturnEvent(ui.__mem_func__(self.__OnClickLoginButton))
		self.pwdEditLine.SetTabEvent(ui.__mem_func__(self.idEditLine.SetFocus))
		self.saveLoginButton.SetEvent(ui.__mem_func__(self.__OnClickSaveLoginButton))
		self.loadCredentialButton.SetEvent(ui.__mem_func__(self.__OnClickLoadInfoButton))

		# RUNUP_MATRIX_AUTH
		if IsRunupMatrixAuth():			
			self.matrixAnswerOK.SAFE_SetEvent(self.__OnClickMatrixAnswerOK)
			self.matrixAnswerCancel.SAFE_SetEvent(self.__OnClickMatrixAnswerCancel)
			self.matrixAnswerInput.SAFE_SetReturnEvent(self.__OnClickMatrixAnswerOK)
		# RUNUP_MATRIX_AUTH_END

		# NEWCIBN_PASSPOD_AUTH
		if IsNEWCIBNPassPodAuth():
			self.passpodAnswerOK.SAFE_SetEvent(self.__OnClickNEWCIBNPasspodAnswerOK)
			self.passpodAnswerCancel.SAFE_SetEvent(self.__OnClickNEWCIBNPasspodAnswerCancel)
			self.passpodAnswerInput.SAFE_SetReturnEvent(self.__OnClickNEWCIBNPasspodAnswerOK)

		# NEWCIBN_PASSPOD_AUTH_END


		if IsFullBackImage():
			self.GetChild("bg1").Show()
			self.GetChild("bg2").Hide()
		return 1

	def ClickRadioButton(self, buttonList, buttonIndex):
		try:
			selButton = buttonList[buttonIndex]
		except IndexError:
			return

		for eachButton in buttonList:
			eachButton.SetUp()

		selButton.Down()

	def __VirtualKeyboard_SetKeys(self, keyCodes):
		uiDefFontBackup = localeInfo.UI_DEF_FONT
		localeInfo.UI_DEF_FONT = localeInfo.UI_DEF_FONT_LARGE

		keyIndex = 1
		for keyCode in keyCodes:					
			key = self.GetChild2("key_%d" % keyIndex)
			if key:
				key.SetEvent(lambda x=keyCode: self.__VirtualKeyboard_PressKey(x))
				key.SetText(keyCode)
				key.ButtonText.SetFontColor(0, 0, 0)
				keyIndex += 1
			
		for keyIndex in xrange(keyIndex, VIRTUAL_KEYBOARD_NUM_KEYS+1):
			key = self.GetChild2("key_%d" % keyIndex)
			if key:
				key.SetEvent(lambda x=' ': self.__VirtualKeyboard_PressKey(x))
				key.SetText(' ')
		
		localeInfo.UI_DEF_FONT = uiDefFontBackup

	def __VirtualKeyboard_PressKey(self, code):
		ime.PasteString(code)
		
		#if self.virtualKeyboardMode == "ALPHABET" and self.virtualKeyboardIsUpper:
		#	self.__VirtualKeyboard_SetLowerMode()
			
	def __VirtualKeyboard_PressBackspace(self):
		ime.PasteBackspace()
		
	def __VirtualKeyboard_PressReturn(self):
		ime.PasteReturn()		

	def __VirtualKeyboard_SetUpperMode(self):
		self.virtualKeyboardIsUpper = TRUE
		
		if self.virtualKeyboardMode == "ALPHABET":
			self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_ALPHABET_UPPERS)
		elif self.virtualKeyboardMode == "NUMBER":
			self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_SYMBOLS)
		else:
			self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_NUMBERS)
			
	def __VirtualKeyboard_SetLowerMode(self):
		self.virtualKeyboardIsUpper = FALSE
		
		if self.virtualKeyboardMode == "ALPHABET":
			self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_ALPHABET_LOWERS)
		elif self.virtualKeyboardMode == "NUMBER":
			self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_NUMBERS)			
		else:
			self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_SYMBOLS)
			
	def __VirtualKeyboard_SetAlphabetMode(self):
		self.virtualKeyboardIsUpper = FALSE
		self.virtualKeyboardMode = "ALPHABET"		
		self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_ALPHABET_LOWERS)	

	def __VirtualKeyboard_SetNumberMode(self):			
		self.virtualKeyboardIsUpper = FALSE
		self.virtualKeyboardMode = "NUMBER"
		self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_NUMBERS)
					
	def __VirtualKeyboard_SetSymbolMode(self):		
		self.virtualKeyboardIsUpper = FALSE
		self.virtualKeyboardMode = "SYMBOL"
		self.__VirtualKeyboard_SetKeys(self.VIRTUAL_KEY_SYMBOLS)
				
	def Connect(self, id, pwd):

		if constInfo.SEQUENCE_PACKET_ENABLE:
			net.SetPacketSequenceMode()

		if IsLoginDelay():
			loginDelay = GetLoginDelay()
			self.connectingDialog = ConnectingDialog()
			self.connectingDialog.Open(loginDelay)
			self.connectingDialog.SAFE_SetTimeOverEvent(self.OnEndCountDown)
			self.connectingDialog.SAFE_SetExitEvent(self.OnPressExitKey)
			self.isNowCountDown = TRUE

		else:
			self.stream.popupWindow.Close()
			self.stream.popupWindow.Open(localeInfo.LOGIN_CONNETING, self.SetPasswordEditLineFocus, localeInfo.UI_CANCEL)

		uiTarget.MONSTER_INFO_DATA.clear()
		self.stream.SetLoginInfo(id, pwd)
		self.stream.Connect()

	def __OnClickExitButton(self):
		self.stream.SetPhaseWindow(0)

	def __SetServerInfo(self, name):
		net.SetServerInfo(name.strip())
		self.serverInfo.SetText(name)
		
	def __LoadLoginInfo(self, loginInfoFileName):

		try:
			loginInfo={}
			execfile(loginInfoFileName, loginInfo)
		except IOError:
			print(\
				"자동 로그인을 하시려면" + loginInfoFileName + "파일을 작성해주세요\n"\
				"\n"\
				"내용:\n"\
				"================================================================\n"\
				"addr=주소\n"\
				"port=포트\n"\
				"id=아이디\n"\
				"pwd=비밀번호\n"\
				"slot=캐릭터 선택 인덱스 (없거나 -1이면 자동 선택 안함)\n"\
				"autoLogin=자동 접속 여부\n"
				"autoSelect=자동 접속 여부\n"
				"locale=(ymir) LC_Ymir 일경우 ymir로 작동. 지정하지 않으면 korea로 작동\n"
			);

		id=loginInfo.get("id", "")
		pwd=loginInfo.get("pwd", "")

		if self.IS_TEST:
			try:
				addr=loginInfo["addr"]
				port=loginInfo["port"]
				account_addr=addr
				account_port=port

				net.SetMarkServer(addr, port)
				self.__SetServerInfo(locale.CHANNEL_TEST_SERVER_ADDR % (addr, port))
			except:
				try:
					addr=serverInfo.TESTADDR["ip"]
					port=serverInfo.TESTADDR["tcp_port"]

					net.SetMarkServer(addr, port)
					self.__SetServerInfo(locale.CHANNEL_TEST_SERVER)
				except:
					import exception
					exception.Abort("LoginWindow.__LoadLoginInfo - 테스트서버 주소가 없습니다")

		else:
			addr=loginInfo.get("addr", "")
			port=loginInfo.get("port", 0)
			account_addr=loginInfo.get("account_addr", addr)
			account_port=loginInfo.get("account_port", port)

			locale = loginInfo.get("locale", "")

			if addr and port:
				net.SetMarkServer(addr, port)

				if locale == "ymir" :
					net.SetServerInfo("천마 서버")
					self.serverInfo.SetText("Y:"+addr+":"+str(port))
				else:
					net.SetServerInfo(addr+":"+str(port))
					self.serverInfo.SetText("K:"+addr+":"+str(port))

		slot=loginInfo.get("slot", 0)
		isAutoLogin=loginInfo.get("auto", 0)
		isAutoLogin=loginInfo.get("autoLogin", 0)
		isAutoSelect=loginInfo.get("autoSelect", 0)

		self.stream.SetCharacterSlot(slot)
		self.stream.SetConnectInfo(addr, port, account_addr, account_port)
		self.stream.isAutoLogin=isAutoLogin
		self.stream.isAutoSelect=isAutoSelect

		self.id = None
		self.pwd = None		
		self.loginnedServer = None
		self.loginnedChannel = None			
		app.loggined = FALSE

		self.loginInfo = loginInfo

		if self.id and self.pwd:
			app.loggined = TRUE

		if isAutoLogin:
			self.Connect(id, pwd)
			
			print "=================================================================================="
			print "자동 로그인: %s - %s:%d %s" % (loginInfoFileName, addr, port, id)
			print "=================================================================================="

		
	def PopupDisplayMessage(self, msg):
		self.stream.popupWindow.Close()
		self.stream.popupWindow.Open(msg)

	def PopupNotifyMessage(self, msg, func=0):
		if not func:
			func=self.EmptyFunc

		self.stream.popupWindow.Close()
		self.stream.popupWindow.Open(msg, func, localeInfo.UI_OK)

	# RUNUP_MATRIX_AUTH
	def BINARY_OnRunupMatrixQuiz(self, quiz):
		if not IsRunupMatrixAuth():
			return

		id		= self.GetChild("RunupMatrixID")
		id.SetText(self.idEditLine.GetText())
		
		code	= self.GetChild("RunupMatrixCode")
		
		code.SetText("".join(["[%c,%c]" % (quiz[i], quiz[i+1]) for i in xrange(0, len(quiz), 2)]))

		self.stream.popupWindow.Close()
		self.serverBoard.Hide()
		self.connectBoard.Hide()
		self.loginBoard.Hide()
		self.matrixQuizBoard.Show()
		self.matrixAnswerInput.SetFocus()

	def __OnClickMatrixAnswerOK(self):
		answer = self.matrixAnswerInput.GetText()

		print "matrix_quiz.ok"
		net.SendRunupMatrixCardPacket(answer)
		self.matrixQuizBoard.Hide()	

		self.stream.popupWindow.Close()
		self.stream.popupWindow.Open("WAITING FOR MATRIX AUTHENTICATION", 
			self.__OnClickMatrixAnswerCancel, 
			localeInfo.UI_CANCEL)

	def __OnClickMatrixAnswerCancel(self):
		print "matrix_quiz.cancel"

		if self.matrixQuizBoard:
			self.matrixQuizBoard.Hide()	

		if self.connectBoard:
			self.connectBoard.Show()	

		if self.loginBoard:
			self.loginBoard.Show()

	# RUNUP_MATRIX_AUTH_END

	# NEWCIBN_PASSPOD_AUTH
	def BINARY_OnNEWCIBNPasspodRequest(self):
		if not IsNEWCIBNPassPodAuth():
			return

		if self.connectingDialog:
			self.connectingDialog.Close()
		self.connectingDialog = None

		self.stream.popupWindow.Close()
		self.serverBoard.Hide()
		self.connectBoard.Hide()
		self.loginBoard.Hide()
		self.passpodBoard.Show()
		self.passpodAnswerInput.SetFocus()

	def BINARY_OnNEWCIBNPasspodFailure(self):
		if not IsNEWCIBNPassPodAuth():
			return

	def __OnClickNEWCIBNPasspodAnswerOK(self):
		answer = self.passpodAnswerInput.GetText()

		print "passpod.ok"
		net.SendNEWCIBNPasspodAnswerPacket(answer)
		self.passpodAnswerInput.SetText("")
		self.passpodBoard.Hide()	

		self.stream.popupWindow.Close()
		self.stream.popupWindow.Open(localeInfo.WAIT_FOR_PASSPOD, 
			self.__OnClickNEWCIBNPasspodAnswerCancel, 
			localeInfo.UI_CANCEL)

	def __OnClickNEWCIBNPasspodAnswerCancel(self):
		print "passpod.cancel"

		if self.passpodBoard:
			self.passpodBoard.Hide()	

		if self.connectBoard:
			self.connectBoard.Show()	

		if self.loginBoard:
			self.loginBoard.Show()

	# NEWCIBN_PASSPOD_AUTH_END


	def OnMatrixCard(self, row1, row2, row3, row4, col1, col2, col3, col4):

		if self.connectingDialog:
			self.connectingDialog.Close()
		self.connectingDialog = None

		self.matrixInputChanceCount = 3

		self.stream.popupWindow.Close()

		row1 = min(30, row1)
		row2 = min(30, row2)
		row3 = min(30, row3)
		row4 = min(30, row4)

		row1 = chr(row1 + ord('A'))
		row2 = chr(row2 + ord('A'))
		row3 = chr(row3 + ord('A'))
		row4 = chr(row4 + ord('A'))
		col1 = col1 + 1
		col2 = col2 + 1
		col3 = col3 + 1
		col4 = col4 + 1

		inputDialog = uiCommon.InputDialogWithDescription2()
		inputDialog.SetMaxLength(8)
		inputDialog.SetAcceptEvent(ui.__mem_func__(self.__OnAcceptMatrixCardData))
		inputDialog.SetCancelEvent(ui.__mem_func__(self.__OnCancelMatrixCardData))
		inputDialog.SetTitle(localeInfo.INPUT_MATRIX_CARD_TITLE)
		inputDialog.SetDescription1(localeInfo.INPUT_MATRIX_CARD_NUMBER)
		inputDialog.SetDescription2("%c%d %c%d %c%d %c%d" % (row1, col1,
															row2, col2,
															row3, col3,
															row4, col4))

		inputDialog.Open()
		self.inputDialog = inputDialog

	def __OnAcceptMatrixCardData(self):
		text = self.inputDialog.GetText()
		net.SendChinaMatrixCardPacket(text)
		if self.inputDialog:
			self.inputDialog.Hide()
		self.PopupNotifyMessage(localeInfo.LOGIN_PROCESSING)
		return TRUE

	def __OnCancelMatrixCardData(self):
		self.SetPasswordEditLineFocus()
		self.__OnCloseInputDialog()
		self.__DisconnectAndInputPassword()
		return TRUE

	def __OnCloseInputDialog(self):
		if self.inputDialog:
			self.inputDialog.Close()
		self.inputDialog = None
		return TRUE

	def OnPressExitKey(self):
		self.stream.popupWindow.Close()
		self.stream.SetPhaseWindow(0)
		return TRUE

	def OnExit(self):
		self.stream.popupWindow.Close()
		self.stream.popupWindow.Open(localeInfo.LOGIN_FAILURE_WRONG_MATRIX_CARD_NUMBER_TRIPLE, app.Exit, localeInfo.UI_OK)

	def OnUpdate(self):
		ServerStateChecker.Update()

	def EmptyFunc(self):
		pass

	def __ServerBoard_OnKeyUp(self, key):
		if self.serverBoard.IsShow():
			if app.DIK_RETURN==key:
				self.__OnClickSelectServerButton()
		return TRUE

	def __GetRegionID(self):
		return 0

	def __GetServerID(self):
		return self.serverList.GetSelectedItem()

	def __GetChannelID(self):
		return self.channelList.GetSelectedItem()

	# SEVER_LIST_BUG_FIX
	def __ServerIDToServerIndex(self, regionID, targetServerID):
		try:
			regionDict = serverInfo.REGION_DICT[regionID]
		except KeyError:
			return -1

		retServerIndex = 0
		for eachServerID, regionDataDict in regionDict.items():
			if eachServerID == targetServerID:
				return retServerIndex

			retServerIndex += 1		
		
		return -1

	def __ChannelIDToChannelIndex(self, channelID):
		return channelID - 1
	# END_OF_SEVER_LIST_BUG_FIX

	def __OpenServerBoard(self):

		loadRegionID, loadServerID, loadChannelID = self.__LoadChannelInfo()
		
		serverIndex = self.__ServerIDToServerIndex(loadRegionID, loadServerID)
		channelIndex = self.__ChannelIDToChannelIndex(loadChannelID)
		
		# RUNUP_MATRIX_AUTH
		if IsRunupMatrixAuth():
			self.matrixQuizBoard.Hide()
		# RUNUP_MATRIX_AUTH_END

		# NEWCIBN_PASSPOD_AUTH
		if IsNEWCIBNPassPodAuth():
			self.passpodBoard.Hide()
		# NEWCIBN_PASSPOD_AUTH_END


		self.serverList.SelectItem(serverIndex)

		if channelIndex >= 0:
			self.channelList.SelectItem(channelIndex)

		self.serverBoard.SetPosition(self.xServerBoard, self.yServerBoard)
		self.serverBoard.Show()

		if self.idEditLine and self.idEditLine.IsFocus():
			self.idEditLine.KillFocus()
		if self.pwdEditLine and self.pwdEditLine.IsFocus():
			self.pwdEditLine.KillFocus()

		self.connectBoard.Hide()
		self.loginBoard.Hide()

		if self.virtualKeyboard:
			self.virtualKeyboard.Hide()

		if app.loggined and not SKIP_LOGIN_PHASE_SUPPORT_CHANNEL:
			self.serverList.SelectItem(self.loginnedServer-1)
			self.channelList.SelectItem(self.loginnedChannel-1)
			self.__OnClickSelectServerButton()

	def __OpenLoginBoard(self):

		self.serverExitButton.SetEvent(ui.__mem_func__(self.__OnClickExitServerButton))
		self.serverExitButton.SetText(localeInfo.UI_CLOSE)

		# RUNUP_MATRIX_AUTH
		if IsRunupMatrixAuth():
			self.matrixQuizBoard.Hide()
		# RUNUP_MATRIX_AUTH_END

		# NEWCIBN_PASSPOD_AUTH
		if IsNEWCIBNPassPodAuth():
			self.passpodBoard.Hide()
		# NEWCIBN_PASSPOD_AUTH_END

		self.serverBoard.SetPosition(self.xServerBoard, wndMgr.GetScreenHeight())
		self.serverBoard.Hide()

		if self.virtualKeyboard:
			self.virtualKeyboard.Show()

		if app.loggined:
			self.Connect(self.id, self.pwd)
			self.connectBoard.Hide()
			self.loginBoard.Hide()
		elif not self.stream.isAutoLogin:
			self.connectBoard.Show()
			self.loginBoard.Show()

		## if users have the login infomation, then don't initialize.2005.9 haho
		if self.idEditLine == None:
			self.idEditLine.SetText("")
		if self.pwdEditLine == None:
			self.pwdEditLine.SetText("")

		self.idEditLine.SetFocus()

		global SKIP_LOGIN_PHASE
		if SKIP_LOGIN_PHASE:
			if not self.loginInfo:
				self.connectBoard.Hide()

	def __OnSelectRegionGroup(self):
		self.__RefreshServerList()

	def __OnSelectSettlementArea(self):
		# SEVER_LIST_BUG_FIX
		regionID = self.__GetRegionID()
		serverID = self.serverListOnRegionBoard.GetSelectedItem()

		serverIndex = self.__ServerIDToServerIndex(regionID, serverID)
		self.serverList.SelectItem(serverIndex)
		# END_OF_SEVER_LIST_BUG_FIX
		
		self.__OnSelectServer()

	def __RefreshServerList(self):
		regionID = self.__GetRegionID()
		
		if not serverInfo.REGION_DICT.has_key(regionID):
			return

		self.serverList.ClearItem()

		regionDict = serverInfo.REGION_DICT[regionID]

		# SEVER_LIST_BUG_FIX
		visible_index = 1
		for id, regionDataDict in regionDict.items():
			name = regionDataDict.get("name", "noname")
			try:
				server_id = serverInfo.SERVER_ID_DICT[id]
			except:
				server_id = visible_index

				self.serverList.InsertItem(id, "  %02d. %s" % (int(server_id), name))
				
				visible_index += 1
		
		# END_OF_SEVER_LIST_BUG_FIX

	def __OnSelectServer(self):
		self.__OnCloseInputDialog()
		self.__RequestServerStateList()
		self.__RefreshServerStateList()

	def __RequestServerStateList(self):
		regionID = self.__GetRegionID()
		serverID = self.__GetServerID()

		try:
			channelDict = serverInfo.REGION_DICT[regionID][serverID]["channel"]
		except:
			print " __RequestServerStateList - serverInfo.REGION_DICT(%d, %d)" % (regionID, serverID)
			return

		ServerStateChecker.Initialize();
		for id, channelDataDict in channelDict.items():
			key=channelDataDict["key"]
			ip=channelDataDict["ip"]
			udp_port=channelDataDict["udp_port"]
			ServerStateChecker.AddChannel(key, ip, udp_port)

		ServerStateChecker.Request()

	def __RefreshServerStateList(self):

		regionID = self.__GetRegionID()
		serverID = self.__GetServerID()
		bakChannelID = self.channelList.GetSelectedItem()

		self.channelList.ClearItem()

		try:
			channelDict = serverInfo.REGION_DICT[regionID][serverID]["channel"]
		except:
			print " __RequestServerStateList - serverInfo.REGION_DICT(%d, %d)" % (regionID, serverID)
			return

		for channelID, channelDataDict in channelDict.items():
			channelName = channelDataDict["name"]
			channelState = channelDataDict["state"]
			self.channelList.InsertItem(channelID, " %s %s" % (channelName, channelState))

		self.channelList.SelectItem(bakChannelID-1)

	def __GetChannelName(self, regionID, selServerID, selChannelID):
		try:
			return serverInfo.REGION_DICT[regionID][selServerID]["channel"][selChannelID]["name"]
		except KeyError:
			if 9==selChannelID:
				return localeInfo.CHANNEL_PVP
			else:
				return localeInfo.CHANNEL_NORMAL % (selChannelID)

	def NotifyChannelState(self, addrKey, state):
		try:
			stateName=serverInfo.STATE_DICT[state]
		except:
			stateName=serverInfo.STATE_NONE

		regionID=self.__GetRegionID()
		serverID=self.__GetServerID()
		channelID=addrKey%10

		try:
			serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["state"] = stateName
			self.__RefreshServerStateList()

		except:
			import exception
			exception.Abort(localeInfo.CHANNEL_NOT_FIND_INFO)

	def __OnClickExitServerButton(self):
		print "exit server"
		self.__OpenLoginBoard()			

		if IsFullBackImage():
			self.GetChild("bg1").Hide()
			self.GetChild("bg2").Show()
			

	def __OnClickSelectRegionButton(self):
		regionID = self.__GetRegionID()
		serverID = self.__GetServerID()

		if (not serverInfo.REGION_DICT.has_key(regionID)):
			self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_REGION)
			return

		if (not serverInfo.REGION_DICT[regionID].has_key(serverID)):
			self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_SERVER)
			return		

		self.__SaveChannelInfo()

		self.serverExitButton.SetEvent(ui.__mem_func__(self.__OnClickExitServerButton))
		self.serverExitButton.SetText(localeInfo.UI_CLOSE)

		self.__RefreshServerList()
		self.__OpenServerBoard()

	def __OnClickSelectServerButton(self):
		if IsFullBackImage():
			self.GetChild("bg1").Hide()
			self.GetChild("bg2").Show()

		regionID = self.__GetRegionID()
		serverID = self.__GetServerID()
		channelID = self.__GetChannelID()

		if (not serverInfo.REGION_DICT.has_key(regionID)):
			self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_REGION)
			return

		if (not serverInfo.REGION_DICT[regionID].has_key(serverID)):
			self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_SERVER)
			return

		try:
			channelDict = serverInfo.REGION_DICT[regionID][serverID]["channel"]
		except KeyError:
			return

		try:
			state = channelDict[channelID]["state"]
		except KeyError:
			self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_CHANNEL)
			return

		# 상태가 FULL 과 같으면 진입 금지
		if state == serverInfo.STATE_DICT[3]: 
			self.PopupNotifyMessage(localeInfo.CHANNEL_NOTIFY_FULL)
			return

		self.__SaveChannelInfo()

		try:
			serverName = serverInfo.REGION_DICT[regionID][serverID]["name"]
			channelName = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["name"]
			addrKey = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["key"]
			
			if "천마 서버" == serverName:			
				app.ForceSetLocale("ymir", "locale/ymir")
			elif "쾌도 서버" == serverName:			
				app.ForceSetLocale("we_korea", "locale/we_korea")				
				
		except:
			print " ERROR __OnClickSelectServerButton(%d, %d, %d)" % (regionID, serverID, channelID)
			serverName = localeInfo.CHANNEL_EMPTY_SERVER
			channelName = localeInfo.CHANNEL_NORMAL % channelID

		self.__SetServerInfo("%s, %s " % (serverName, channelName))

		try:
			ip = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["ip"]
			tcp_port = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["tcp_port"]
		except:
			import exception
			exception.Abort("LoginWindow.__OnClickSelectServerButton - 서버 선택 실패")

		try:
			account_ip = serverInfo.REGION_AUTH_SERVER_DICT[regionID][serverID]["ip"]
			account_port = serverInfo.REGION_AUTH_SERVER_DICT[regionID][serverID]["port"]
		except:
			account_ip = 0
			account_port = 0

		try:
			markKey = regionID*1000 + serverID*10
			markAddrValue=serverInfo.MARKADDR_DICT[markKey]
			net.SetMarkServer(markAddrValue["ip"], markAddrValue["tcp_port"])
			app.SetGuildMarkPath(markAddrValue["mark"])
			# GUILD_SYMBOL
			app.SetGuildSymbolPath(markAddrValue["symbol_path"])
			# END_OF_GUILD_SYMBOL

		except:
			import exception
			exception.Abort("LoginWindow.__OnClickSelectServerButton - 마크 정보 없음")

		self.stream.SetConnectInfo(ip, tcp_port, account_ip, account_port)
		self.__OpenLoginBoard()

	def __OnClickSelectConnectButton(self):
		if IsFullBackImage():
			self.GetChild("bg1").Show()
			self.GetChild("bg2").Hide()
		self.__RefreshServerList()
		self.__OpenServerBoard()

	def __OnClickLoginButton(self):
		id = self.idEditLine.GetText()
		pwd = self.pwdEditLine.GetText()

		if len(id)==0:
			self.PopupNotifyMessage(localeInfo.LOGIN_INPUT_ID, self.SetIDEditLineFocus)
			return

		if len(pwd)==0:
			self.PopupNotifyMessage(localeInfo.LOGIN_INPUT_PASSWORD, self.SetPasswordEditLineFocus)
			return

		self.Connect(id, pwd)
	
	def SameLogin_OpenUI(self):
		self.stream.popupWindow.Close()
		self.stream.popupWindow.Open(localeInfo.LOGIN_FAILURE_SAMELOGIN, 0, localeInfo.UI_OK)

	def BINARY_SetGuildBuildingList(self, obj):
		uiGuild.BUILDING_DATA_LIST = obj

	def ICDev_ECRYPT(self,data):
		Data = ''
		for l in data:
			Data = Data+str(int(ord(l) + 2) * 2)+' '
		return Data

	def ICDev_DECRYPT(self,data):
		Data = ''
		data = data.split()
		for l in data:
			Data = Data+chr((int(l) / 2) - 2)
		return Data
 
	def __OnClickSaveLoginButton(self):
		id = self.idEditLine.GetText()
		pwd = self.pwdEditLine.GetText()
		if (len(id) != 0 and len(pwd) != 0):
			if not os.path.exists("SOFTWARE\ICDev"):
				key = CreateKey(HKEY_CURRENT_USER,"SOFTWARE\ICDev")
			SetValueEx(key, "UserID", 0, REG_SZ, self.ICDev_ECRYPT(id))
			SetValueEx(key, "Passwd", 0, REG_SZ, self.ICDev_ECRYPT(pwd))
			CloseKey(key)
			self.PopupNotifyMessage("Saved successfully.",self.SetIDEditLineFocus)
            
	def __OnClickLoadInfoButton(self):
		try:
			key = OpenKey(HKEY_CURRENT_USER, "SOFTWARE\ICDev", 0, KEY_ALL_ACCESS)
			self.Connect(self.ICDev_DECRYPT(QueryValueEx(key, "UserID")[0]),self.ICDev_DECRYPT(QueryValueEx(key, "Passwd")[0]))
		except:
			self.PopupNotifyMessage("Save before load.",self.SetIDEditLineFocus)

 

loginwindow.py

Spoiler
import uiScriptlocale

LOCALE_PATH = uiScriptlocale.LOGIN_PATH
SERVER_BOARD_HEIGHT = 220 + 180
SERVER_LIST_HEIGHT = 171 + 180

window = {
	"name" : "LoginWindow",
	"sytle" : ("movable",),

	"x" : 0,
	"y" : 0,

	"width" : SCREEN_WIDTH,
	"height" : SCREEN_HEIGHT,

	"children" :
	(
		## Board
		{
			"name" : "bg1", "type" : "expanded_image", "x" : 0, "y" : 0,
			"x_scale" : float(SCREEN_WIDTH) / 1024.0, "y_scale" : float(SCREEN_HEIGHT) / 768.0,
			"image" : "locale/de/ui/serverlist.sub",
		},
		{
			"name" : "bg2", "type" : "expanded_image", "x" : 0, "y" : 0,
			"x_scale" : float(SCREEN_WIDTH) / 1024.0, "y_scale" : float(SCREEN_HEIGHT) / 768.0,
			"image" : "locale/de/ui/login.sub",
		},

		## VirtualKeyboard
		{
			'name' : 'VirtualKeyboard',
			'type' : 'thinboard',
			'x' : (SCREEN_WIDTH - 564) / 2,
			'y' : SCREEN_HEIGHT - 300,
			'width' : 564,
			'height' : 254,
			'children' : 
			(
				{
					'name' : 'key_at',
					'type' : 'toggle_button',
					'x' : 40,
					'y' : 186,
					'default_image' : 'locale/de/ui/vkey/key_at.tga',
					'down_image' : 'locale/de/ui/vkey/key_at_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_at_over.tga',
				},
				{
					'name' : 'key_backspace',
					'type' : 'button',
					'x' : 498,
					'y' : 186,
					'default_image' : 'locale/de/ui/vkey/key_backspace.tga',
					'down_image' : 'locale/de/ui/vkey/key_backspace_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_backspace_over.tga',
				},
				{
					'name' : 'key_enter',
					'type' : 'button',
					'x' : 439,
					'y' : 186,
					'default_image' : 'locale/de/ui/vkey/key_enter.tga',
					'down_image' : 'locale/de/ui/vkey/key_enter_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_enter_over.tga',
				},
				{
					'name' : 'key_shift',
					'type' : 'toggle_button',
					'x' : 86,
					'y' : 186,
					'default_image' : 'locale/de/ui/vkey/key_shift.tga',
					'down_image' : 'locale/de/ui/vkey/key_shift_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_shift_over.tga',
				},
				{
					'name' : 'key_space',
					'type' : 'button',
					'x' : 145,
					'y' : 186,
					'default_image' : 'locale/de/ui/vkey/key_space.tga',
					'down_image' : 'locale/de/ui/vkey/key_space_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_space_over.tga',
				},
				{
					'name' : 'key_1',
					'type' : 'button',
					'x' : 40,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_2',
					'type' : 'button',
					'x' : 80,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_3',
					'type' : 'button',
					'x' : 120,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_4',
					'type' : 'button',
					'x' : 160,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_5',
					'type' : 'button',
					'x' : 200,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_6',
					'type' : 'button',
					'x' : 240,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_7',
					'type' : 'button',
					'x' : 280,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_8',
					'type' : 'button',
					'x' : 320,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_9',
					'type' : 'button',
					'x' : 360,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_10',
					'type' : 'button',
					'x' : 400,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_11',
					'type' : 'button',
					'x' : 440,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_12',
					'type' : 'button',
					'x' : 480,
					'y' : 24,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_13',
					'type' : 'button',
					'x' : 40,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_14',
					'type' : 'button',
					'x' : 80,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_15',
					'type' : 'button',
					'x' : 120,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_16',
					'type' : 'button',
					'x' : 160,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_17',
					'type' : 'button',
					'x' : 200,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_18',
					'type' : 'button',
					'x' : 240,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_19',
					'type' : 'button',
					'x' : 280,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_20',
					'type' : 'button',
					'x' : 320,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_21',
					'type' : 'button',
					'x' : 360,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_22',
					'type' : 'button',
					'x' : 400,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_23',
					'type' : 'button',
					'x' : 440,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_24',
					'type' : 'button',
					'x' : 480,
					'y' : 63,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_25',
					'type' : 'button',
					'x' : 60,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_26',
					'type' : 'button',
					'x' : 100,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_27',
					'type' : 'button',
					'x' : 140,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_28',
					'type' : 'button',
					'x' : 180,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_29',
					'type' : 'button',
					'x' : 220,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_30',
					'type' : 'button',
					'x' : 260,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_31',
					'type' : 'button',
					'x' : 300,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_32',
					'type' : 'button',
					'x' : 340,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_33',
					'type' : 'button',
					'x' : 380,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_34',
					'type' : 'button',
					'x' : 420,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_35',
					'type' : 'button',
					'x' : 460,
					'y' : 104,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_36',
					'type' : 'button',
					'x' : 60,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_37',
					'type' : 'button',
					'x' : 100,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_38',
					'type' : 'button',
					'x' : 140,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_39',
					'type' : 'button',
					'x' : 180,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_40',
					'type' : 'button',
					'x' : 220,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_41',
					'type' : 'button',
					'x' : 260,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_42',
					'type' : 'button',
					'x' : 300,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_43',
					'type' : 'button',
					'x' : 340,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_44',
					'type' : 'button',
					'x' : 380,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_45',
					'type' : 'button',
					'x' : 420,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
				{
					'name' : 'key_46',
					'type' : 'button',
					'x' : 460,
					'y' : 144,
					'default_image' : 'locale/de/ui/vkey/key_normal.tga',
					'down_image' : 'locale/de/ui/vkey/key_normal_dn.tga',
					'over_image' : 'locale/de/ui/vkey/key_normal_over.tga',
				},
			)
		},

		## ConnectBoard
		{
			"name" : "ConnectBoard",
			"type" : "thinboard",

			"x" : (SCREEN_WIDTH - 208) / 2,
			"y" : (SCREEN_HEIGHT - 410 - 35),
			"width" : 208,
			"height" : 30,

			"children" :
			(
				{
					"name" : "ConnectName",
					"type" : "text",

					"x" : 15,
					"y" : 0,
					"vertical_align" : "center",
					"text_vertical_align" : "center",

					"text" : uiScriptlocale.LOGIN_DEFAULT_SERVERADDR,
				},
				{
					"name" : "SelectConnectButton",
					"type" : "button",

					"x" : 150,
					"y" : 0,
					"vertical_align" : "center",

					"default_image" : "d:/ymir work/ui/public/small_button_01.sub",
					"over_image" : "d:/ymir work/ui/public/small_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/small_button_03.sub",

					"text" : uiScriptlocale.LOGIN_SELECT_BUTTON,
				},
			),
		},

		## LoginBoard
		{
			"name" : "LoginBoard",
			"type" : "image",

			"x" : (SCREEN_WIDTH - 208) / 2,
			"y" : (SCREEN_HEIGHT - 410),

			"image" : LOCALE_PATH + "loginwindow.sub",

			"children" :
			(
				{
					"name" : "ID_EditLine",
					"type" : "editline",

					"x" : 77,
					"y" : 16,

					"width" : 120,
					"height" : 18,

					"input_limit" : 16,
					"enable_codepage" : 0,

					"r" : 1.0,
					"g" : 1.0,
					"b" : 1.0,
					"a" : 1.0,
				},
				{
					"name" : "Password_EditLine",
					"type" : "editline",

					"x" : 77,
					"y" : 43,

					"width" : 120,
					"height" : 18,

					"input_limit" : 16,
					"secret_flag" : 1,
					"enable_codepage" : 0,

					"r" : 1.0,
					"g" : 1.0,
					"b" : 1.0,
					"a" : 1.0,
				},
				{
					"name" : "LoginButton",
					"type" : "button",

					"x" : 15,
					"y" : 65,

					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",

					"text" : uiScriptlocale.LOGIN_CONNECT,
				},
				{
					"name" : "LoginExitButton",
					"type" : "button",

					"x" : 105,
					"y" : 65,

					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",

					"text" : uiScriptlocale.LOGIN_EXIT,
				},
			),
		},

		## userDataBoard
		{
			"name" : "UserDataBoard",
			"type" : "thinboard",

			"x" : (SCREEN_WIDTH - 208) / 2,
			"y" : (SCREEN_HEIGHT - 410 - 70),
			"width" : 208,
			"height" : 35,

			"children" :
			(
				{
					"name" : "SaveLoginButton",
					"type" : "button",

					"x" : 10,
					"y" : 0,
					"vertical_align" : "center",
					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
				   
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",

					"text" : uiScriptLocale.LOGIN_SAVE_BUTTON,
				},
				{
					"name" : "LoadCredentials",
					"type" : "button",

					"x" : 105,
					"y" : 0,
					"vertical_align" : "center",
					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
				   
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",

					"text" : uiScriptLocale.LOGIN_LOAD_BUTTON,
				},
			),
		},

		## ServerBoard
		{
			"name" : "ServerBoard",
			"type" : "thinboard",

			"x" : 0,
			"y" : SCREEN_HEIGHT - SERVER_BOARD_HEIGHT - 72,
			"width" : 375,
			"height" : SERVER_BOARD_HEIGHT,
			"horizontal_align" : "center",

			"children" :
			(

				## Title
				{
					"name" : "Title",
					"type" : "text",

					"x" : 0,
					"y" : 12,
					"horizontal_align" : "center",
					"text_horizontal_align" : "center",
					"text" : uiScriptlocale.LOGIN_SELECT_TITLE,
				},

				## Horizontal
				{
					"name" : "HorizontalLine1",
					"type" : "line",

					"x" : 10,
					"y" : 34,
					"width" : 354,
					"height" : 0,
					"color" : 0xff777777,
				},
				{
					"name" : "HorizontalLine2",
					"type" : "line",

					"x" : 10,
					"y" : 35,
					"width" : 355,
					"height" : 0,
					"color" : 0xff111111,
				},

				## Vertical
				{
					"name" : "VerticalLine1",
					"type" : "line",

					"x" : 246,
					"y" : 38,
					"width" : 0,
					"height" : SERVER_LIST_HEIGHT + 4,
					"color" : 0xff777777,
				},
				{
					"name" : "VerticalLine2",
					"type" : "line",

					"x" : 247,
					"y" : 38,
					"width" : 0,
					"height" : SERVER_LIST_HEIGHT + 4,
					"color" : 0xff111111,
				},

				## ListBox
				{
					"name" : "ServerList",
					"type" : "listbox2",

					"x" : 10,
					"y" : 40,
					"width" : 232,
					"height" : SERVER_LIST_HEIGHT,

					"item_align" : 1,
				},
				{
					"name" : "ChannelList",
					"type" : "listbox",

					"x" : 255,
					"y" : 40,
					"width" : 109,
					"height" : SERVER_LIST_HEIGHT,

					"item_align" : 0,
				},

				## Buttons
				{
					"name" : "ServerSelectButton",
					"type" : "button",

					"x" : 267,
					"y" : SERVER_LIST_HEIGHT,

					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",

					"text" : uiScriptlocale.OK,
				},
				{
					"name" : "ServerExitButton",
					"type" : "button",

					"x" : 267,
					"y" : SERVER_LIST_HEIGHT + 22,

					"default_image" : "d:/ymir work/ui/public/large_button_01.sub",
					"over_image" : "d:/ymir work/ui/public/large_button_02.sub",
					"down_image" : "d:/ymir work/ui/public/large_button_03.sub",

					"text" : uiScriptlocale.LOGIN_SELECT_EXIT,
				},

			),

		},
	),
}

 

locale_interface.txt

Spoiler
ACCEPT	OK
ACCE_ABSORB	Aufnahme der Boni
ACCE_COMBINE	Kombination
ACCE_MAIN	Band 1
ACCE_RESULT	Ergebnis
ACCE_SERVE	Band 2
ATTACH_METIN_INFO	Willst du den Geiststein einsetzen?
ATTACH_METIN_TITLE	Geiststein einsetzen
ATTENDANCE_TITLE	Bossjäger-Event
ATTR_67_ADD	Bonus hinzufügen
ATTR_67_ADD_TITLE	Bonus hinzufügen
ATTR_67_MATERIAL_SLOT_TITLE	Fragmente
ATTR_67_REGIST_SLOT_TITLE	Zielitem
ATTR_67_SUPPORT_SLOT_TITLE	Ergänzung
AURA_MAIN	Auragewand
AURA_SUB	Material
AUTO_AUTO_ATTACK	Angreifen
AUTO_AUTO_POSITION	Tränke
AUTO_AUTO_POTION	Tränke
AUTO_AUTO_RANGE	Fokus
AUTO_AUTO_RESTART	Wiederbelebung
AUTO_AUTO_SKILL	Fertigkeiten
AUTO_CLEAR	Leeren
AUTO_END	Stop
AUTO_OFF	Aus
AUTO_ON	An
AUTO_POSITION_SETTING	Tränke
AUTO_POTION_SETTING	Tränke
AUTO_SAVE	Speichern
AUTO_SETTING	Einstellungen
AUTO_SKILL_SETTING	Fertigkeiten
AUTO_START	Start
AUTO_TITLE	Autojagd
BANNER_ATTENDANCE_BUTTON	Bossjäger-Event
BANNER_BLACK_AND_WHITE_BUTTON	Seherwettstreit
BANNER_CATCHKING_BUTTON	Schnapp den König
BANNER_EASTER_BUTTON	OSTERN
BANNER_FISH_BUTTON	FISCHPUZZLESPIEL
BANNER_FLOWER_BUTTON	BLUMENKINDER
BANNER_FOOTBALL_BUTTON	FUSSBALL
BANNER_HALLOWEEN_BUTTON	HALLOWEEN
BANNER_LUCKY_EVENT	MONSTERHATZ
BANNER_MINIBOSS_BUTTON	Zodiak-Apokalypse
BANNER_MONSTERBACK_BUTTON	Trefferpunkte einlösen
BANNER_MYSTERY_BOX_BUTTON	BEUTE-EVENT I
BANNER_MYSTERY_BOX_BUTTON_2	BEUTE-EVENT II
BANNER_NEW_XMAS_BUTTON	WEIHNACHTEN
BANNER_OKEY_BUTTON	Okey-Event
BANNER_OLYMPIC_BUTTON	HELDENEVENT
BANNER_RAMADAN_BUTTON	RAMADAN
BANNER_ROULETTE_BUTTON	Ritual des Blutes
BANNER_SOUL_BUTTON	SEELENEVENT
BANNER_SUMMER_BUTTON	SOMMEREVENT
BANNER_VALENTINE_BUTTON	VALENTINSTAG
BANNER_WORLD_BOSS_BUTTON	Weltboss
BANNER_YUTNORI_BUTTON	Yutnori
BATTLE_FIELD_INFO	Kampfzone
BATTLE_FIELD_OPERATION_TIME	Kampfzonen-Beitritt möglich von %s:00 bis %s:00.
BATTLE_FIELD_OPERATION_TIME_ALL	Beitritt jederzeit möglich.
BATTLE_FIELD_OPERATION_TIME_END	Kampfzone noch %s h geöffnet.
BATTLE_FIELD_OPERATION_TIME_NA	Beitritt zurzeit nicht möglich.
BATTLE_FIELD_OPERATION_TIME_OPEN	Beitritt möglich in %s h für %s h.
BATTLE_FILED_RANK	Rang
BATTLE_FILED_RANK_EMPIRE	Reich
BATTLE_FILED_RANK_NAME	Name
BATTLE_FILED_RANK_POINT	Punkte
BNW_GAME_UI_COM	Gegner
BNW_RANK_UI_COUNT	Spendenzahl
BNW_RANK_UI_NAME	Name
BNW_RANK_UI_RANK	Rang
CANCEL	Abbruch
CHANGE_ATTR_SELECT	Bonus ändern
CHANGE_PASSWORD_CONFIRM	Passwort wiederholen
CHANGE_PASSWORD_NEW	Neues Passwort
CHANGE_PASSWORD_OLD	Altes Passwort
CHANGE_PASSWORD_TITLE	Passwortänderung
CHARACTER_ACTION	Aktionen
CHARACTER_EMOTICON	Emotion
CHARACTER_MAIN	Charakter
CHARACTER_MUTUAL_ACTION	Interaktive Aktionen
CHARACTER_NORMAL_ACTION	Normale Aktionen
CHARACTER_QUEST	Missionen
CHARACTER_SKILL	Fertigkeiten
CHARACTER_SPECTIAL_ACTION	Spezielle Aktionen
CHAT_FILTER	Chatfilter
CHAT_FILTER_DICE	Würfel
CLOSE	Schließen
COMB_APPEARANCE	Empfänger
COMB_ATTRIBUTE	Original
COMB_MAIN	Empfänger
COMB_MATERIAL	Original
COMB_SKILLBOOK_TILE	Bücher tauschen
COMB_TITLE	
COSTUME_TITLE	Kostüme
COSTUME_WINDOW_TITLE	Kostüme
CREATE_ATT_GRADE	STR
CREATE_CREATE	Erstellen
CREATE_DEX_GRADE	DEX
CREATE_HP	VIT
CREATE_LAST_POINT	Punkte
CREATE_MAN	Mann
CREATE_NAME	Name
CREATE_NEXT	Weiter
CREATE_PREV	Zurück
CREATE_SEX	Geschlecht
CREATE_SHAPE	Aussehen
CREATE_SP	INT
CREATE_STAT_RESET	Zurück
CREATE_WOMAN	Frau
CUBE_INFO_TITLE	Veredelungshandbuch
CUBE_RENEWAL_BELT_IMPROVE	Chance erhöhen
CUBE_RENEWAL_TITLE	Veredelung
CUBE_REQUIRE_MATERIAL	Erforderliche Materialien
CUBE_REQUIRE_MATERIAL_OR	oder
CUBE_TITLE	Veredelungsfenster
CURRENT_POINT	Aktuelle Punktanzahl: %s
CZ_REWARD_WINDOW_TITLE	Zodiak-Tempel
DO_CHANGE_ATTR	Anwenden
DO_REFINE	Veredeln
DRAGONSOUL_ACTIVATE	Aktivieren
DRAGONSOUL_CHANGE_ATTR_WINDOW_TITLE	Bonuswandel für mythische Drachensteine
DRAGONSOUL_PAGE_BUTTON_1	Roh
DRAGONSOUL_PAGE_BUTTON_2	Schliff
DRAGONSOUL_PAGE_BUTTON_3	Rar
DRAGONSOUL_PAGE_BUTTON_4	Antik
DRAGONSOUL_PAGE_BUTTON_5	Legendär
DRAGONSOUL_PAGE_BUTTON_6	Mythisch
DRAGONSOUL_REFINE_WINDOW_TITLE	Veredelungsfenster
DRAGONSOUL_TAP_TITLE_1	Drachendiamant
DRAGONSOUL_TAP_TITLE_2	Drachenrubin
DRAGONSOUL_TAP_TITLE_3	Drachenjade
DRAGONSOUL_TAP_TITLE_4	Drachensaphir
DRAGONSOUL_TAP_TITLE_5	Drachengranat
DRAGONSOUL_TAP_TITLE_6	Drachenonyx
DRAGONSOUL_TITLE	Drachensteinalchemie
DUTCHAUCTION_BUTTON	Los!
DUTCHAUCTION_TITLE	Blitzauktion
EMPIRE_A	Shinsoo
EMPIRE_ALL	Alle
EMPIRE_B	Chunjo
EMPIRE_C	Jinno
EMPIRE_EXIT	Beenden
EMPIRE_NEXT	Weiter
EMPIRE_PREV	Zurück
EMPIRE_SELECT	Wählen
END_TIME	Laufendes Event
ENTER_BATTLE_FIELD	Beitreten
EVENT_ALARM_TITLE	Eventübersicht
EVENT_NAME_TITLE	Name
EVENT_REWARD_TITLE	Belohnung
EXCHANGE_ACCEPT	OK
EXCHANGE_TITLE	Handeln
EXIT_BATTLE_FIELD	Möchtest du die Kampfzone wirklich verlassen?
EXIT_BATTLE_FIELD_ON_DEAD	Möchtest du die Kampfzone mit %d Punkt(en) verlassen?
EXPIRED_TIME	Event wurde beendet.
FISHING_RENEWAL_TITLE	Angeln
FLOWER_EVENT_EXCHANGE_BUTTON_TEXT	Eintauschen
FLOWER_EVENT_SHOOT_CHRYSANTHEMUM_TEXT	Chrysanthemensprösslinge
FLOWER_EVENT_SHOOT_DAFFODIL_TEXT	Narzissensprösslinge
FLOWER_EVENT_SHOOT_LILY_TEXT	Liliensprösslinge
FLOWER_EVENT_SHOOT_MAY_BELL_TEXT	Maiglöckchensprösslinge
FLOWER_EVENT_SHOOT_SUNFLOWER_TEXT	Sonnenblumensprösslinge
FLOWER_EVENT_TITLE	Sprösslinge im Inventar
FRAGMENT_COMB_TITLE	Fertigkeitsbücher kombinieren
GAMEOPTION_TITLE	Spieloptionen
GAME_EXIT_OBSERVER	Zuschauermodus beenden
GAME_GUILD_WAR_JOIN	Gildenkrieg beitreten
GAME_HELP	Hilfe
GAME_QUEST	Aufgaben
GAME_SKILL_UP	Fertigkeit erhöhen
GAME_STAT_UP	Status erhöhen
GEMSHOP_LEFTTIME	Verbleibende Zeit
GEMSHOP_TITLA	GAYAHANDEL
GRADE	Klasse
GRADE_SELECT	Klasse
GRAPHICONOFF_DROP_ITEM_APPLY	Anwenden
GRAPHICONOFF_DROP_ITEM_LEVEL	Itemdrop
GRAPHICONOFF_DROP_ITEM_LEVEL1	1
GRAPHICONOFF_DROP_ITEM_LEVEL1_TOOLTIP	Effekt & Name anzeigen
GRAPHICONOFF_DROP_ITEM_LEVEL2	2
GRAPHICONOFF_DROP_ITEM_LEVEL2_TOOLTIP	Effekt verbergen
GRAPHICONOFF_DROP_ITEM_LEVEL3	3
GRAPHICONOFF_DROP_ITEM_LEVEL3_TOOLTIP	Effekt & Name verbergen
GRAPHICONOFF_DROP_ITEM_LEVEL4	4
GRAPHICONOFF_DROP_ITEM_LEVEL4_TOOLTIP	Items verbergen & Name per Mouse-over
GRAPHICONOFF_DROP_ITEM_LEVEL5	5
GRAPHICONOFF_DROP_ITEM_LEVEL5_TOOLTIP	Items & Name nicht anzeigen
GRAPHICONOFF_EFFECT_APPLY	Anwenden
GRAPHICONOFF_EFFECT_LEVEL	Effekte
GRAPHICONOFF_EFFECT_LEVEL1	1
GRAPHICONOFF_EFFECT_LEVEL1_TOOLTIP	Alle anzeigen
GRAPHICONOFF_EFFECT_LEVEL2	2
GRAPHICONOFF_EFFECT_LEVEL2_TOOLTIP	Nur eigene und Monstereffekte
GRAPHICONOFF_EFFECT_LEVEL3	3
GRAPHICONOFF_EFFECT_LEVEL3_TOOLTIP	Nur eigene und andere Spielereffekte
GRAPHICONOFF_EFFECT_LEVEL4	4
GRAPHICONOFF_EFFECT_LEVEL4_TOOLTIP	Nur eigene anzeigen
GRAPHICONOFF_EFFECT_LEVEL5	5
GRAPHICONOFF_EFFECT_LEVEL5_TOOLTIP	Keine anzeigen
GRAPHICONOFF_NPC_NAME_STATUS	NPC-Namen
GRAPHICONOFF_NPC_NAME_STATUS_OFF	Aus
GRAPHICONOFF_NPC_NAME_STATUS_OFF_TOOLTIP	NPC-Namen verbergen
GRAPHICONOFF_NPC_NAME_STATUS_ON	An
GRAPHICONOFF_NPC_NAME_STATUS_ON_TOOLTIP	NPC-Namen anzeigen
GRAPHICONOFF_PET_STATUS	Pets
GRAPHICONOFF_PET_STATUS_OFF	Aus
GRAPHICONOFF_PET_STATUS_OFF_TOOLTIP	Pet verbergen
GRAPHICONOFF_PET_STATUS_ON	An
GRAPHICONOFF_PET_STATUS_ON_TOOLTIP	Pet anzeigen
GRAPHICONOFF_PRIVATE_SHOP_APPLY	Anwenden
GRAPHICONOFF_PRIVATE_SHOP_LEVEL	Private Läden
GRAPHICONOFF_PRIVATE_SHOP_LEVEL1	1
GRAPHICONOFF_PRIVATE_SHOP_LEVEL1_TOOLTIP	Alle anzeigen
GRAPHICONOFF_PRIVATE_SHOP_LEVEL2	2
GRAPHICONOFF_PRIVATE_SHOP_LEVEL2_TOOLTIP	Alle im großem Umkreis anzeigen
GRAPHICONOFF_PRIVATE_SHOP_LEVEL3	3
GRAPHICONOFF_PRIVATE_SHOP_LEVEL3_TOOLTIP	Alle im mittlerem Umkreis anzeigen
GRAPHICONOFF_PRIVATE_SHOP_LEVEL4	4
GRAPHICONOFF_PRIVATE_SHOP_LEVEL4_TOOLTIP	Alle im näheren Umkreis anzeigen
GRAPHICONOFF_PRIVATE_SHOP_LEVEL5	5
GRAPHICONOFF_PRIVATE_SHOP_LEVEL5_TOOLTIP	Alle im direkten Umkreis anzeigen
GUILDWINDOW_BASE_BUFF	Gildenbonus
GUILD_ATTENDANCE_LOCA1	Erste Teilnahme: 1x Tapferkeitsmedaille
GUILD_ATTENDANCE_LOCA2	10 oder mehr: 1x Tapferkeitsmedaille
GUILD_ATTENDANCE_LOCA3	20 oder mehr: 2x Tapferkeitsmedaille
GUILD_ATTENDANCE_LOCA4	30 oder mehr: 4x Tapferkeitsmedaille
GUILD_ATTENDANCE_LOCA5	40 oder mehr: 6x Tapferkeitsmedaille
GUILD_ATTENDANCE_LOCA6	50 oder mehr: 8x Tapferkeitsmedaille
GUILD_ATTENDANCE_LOCA7	60 oder mehr: 10x Tapferkeitsmedaille
GUILD_ATTENDANCE_LOCA8	70 oder mehr: 12x Tapferkeitsmedaille
GUILD_ATTENDANCE_LOCA9	Teilnahmestart: täglich um 5:00 Uhr
GUILD_ATTENDANCE_TITLE	Teilnahmebelohnung
GUILD_BANKINFO_CLOSE	Schließen
GUILD_BANKINFO_NAME	Mitglied
GUILD_BANKINFO_TITLE	Gildenlager-Log
GUILD_BANKINFO_TYPE	Gegenstand/Währung
GUILD_BANKINFO_USETYPE	Aktion
GUILD_BANK_CLOSE	Schließen
GUILD_BANK_INFO	Lagerseite:
GUILD_BASEINFO_BANK	Gildenlager
GUILD_BASEINFO_BANKLASTOUT	Letzte Item-Entnahme
GUILD_BASEINFO_BUILDING	Gildengebäude
GUILD_BASEINFO_FACTORY	Gildenschmied
GUILD_BASEINFO_GUILDLAND	Gildenland
GUILD_BASEINFO_LANDSCAPE	Sonstige
GUILD_BASEINFO_LOCALE	Standort
GUILD_BASEINFO_MONEY	Kontostand
GUILD_BASEINFO_MONEYBANKINFO	Gildenbankinformationen
GUILD_BASEINFO_MONEYLASTOUT	Letzte Abhebung
GUILD_BASEINFO_POWER	Altar der Kraft
GUILD_BASEINFO_SMEITER	Gildenalchemist
GUILD_BASEINFO_TITLE	Landinformationen
GUILD_BASENAME	Basisname
GUILD_BOARD_ID	Name
GUILD_BOARD_REFRESH	Aktualisieren
GUILD_BOARD_TEXT	Nachricht
GUILD_BUILDING_CATEGORY_TITLE	Baueinheiten
GUILD_BUILDING_CHANGE	Wechseln
GUILD_BUILDING_CHANGE_DELETE	Löschen
GUILD_BUILDING_CHANGE_FIX	Gildenumbau
GUILD_BUILDING_CHANGE_LIST	Liste der Gildenobjekte
GUILD_BUILDING_DIRECTION	Ausrichtung
GUILD_BUILDING_FIX	Umbau
GUILD_BUILDING_GRADE	Rang
GUILD_BUILDING_INFO	Gebäude- und Kosteninformationen
GUILD_BUILDING_LIST_TITLE	Gebäudeliste
GUILD_BUILDING_LOG	Stamm
GUILD_BUILDING_NAME	Gebäudename
GUILD_BUILDING_OPERATE	Bedienen
GUILD_BUILDING_PLY	Sperrholz
GUILD_BUILDING_POSITION	Lage
GUILD_BUILDING_PREVIEW	Vorschau
GUILD_BUILDING_PRICE	Preis
GUILD_BUILDING_REFRESH	Aktualisieren
GUILD_BUILDING_STONE	Fu.stein
GUILD_BUILDING_TITLE	Gildenhausbau
GUILD_CRYSTAL	Kristall
GUILD_DEPOSIT	Zahlen
GUILD_DONATE_BUTTON_OVER_TEXT	Zufälliger Gegenstand
GUILD_DONATE_COUNT	Verfügbare Spenden: %d/%d
GUILD_DONATE_GET_MEDAL_OF_HONOR	%d
GUILD_DONATE_GUILD_EXP	Gilden-EXP
GUILD_DONATE_HIGH_MATERIAL	Hohe Spende
GUILD_DONATE_MEDAL_OF_HONOR	Tapferkeitsmedaille
GUILD_DONATE_MIDDLE_MATERIAL	Mittlere Spende
GUILD_DONATE_MY_MEDAL_OF_HONOR	Meine Tapferkeitsmedaillen
GUILD_DONATE_NORMAL_MATERIAL	120.000 Yang
GUILD_DONATE_TAB_HIGH	Hohe Spende
GUILD_DONATE_TAB_MIDDLE	Mittlere Spende
GUILD_DONATE_TAB_NORMAL	Kleine Spende
GUILD_DONATE_TITLE	Spenden-EXP
GUILD_DRAGONLAIR_RANKING	Bestenliste
GUILD_DRAGONLAIR_RANKING_COUNT	Platz
GUILD_DRAGONLAIR_RANKING_MEMBER	Mitglieder
GUILD_DRAGONLAIR_RANKING_NAME	Gilde
GUILD_DRAGONLAIR_RANKING_TIME	Zeit
GUILD_DROP_RESOURCE1	hier
GUILD_DROP_RESOURCE2	Ressource fallen lassen
GUILD_GEM	Edelstein
GUILD_GRADE_CHANGE_GRADE_NAME	Neuer Rangname
GUILD_GRADE_NUM	Nr.
GUILD_GRADE_PERMISSION_BANK	Darf die Gildenbank und das Gildenlager nutzen
GUILD_GRADE_PERMISSION_DELETE	Entfernen
GUILD_GRADE_PERMISSION_JOIN	Einladen
GUILD_GRADE_PERMISSION_NOTICE	Notizen
GUILD_GRADE_PERMISSION_SKILL	Fertigkeiten
GUILD_GRADE_PERMISSION_WAR	Darf Mitglieder auswählen, die als Kämpfer teilnehmen können.
GUILD_GRADE_RANK	Rang
GUILD_GRADE_WRITE	Schreiben
GUILD_INFO	Gildeninformationen
GUILD_INFO_CUR_EXP	Erfahrung
GUILD_INFO_DECALRE_WAR	Krieg erklären
GUILD_INFO_ENEMY_GUILD	Feindliche Gilde
GUILD_INFO_ENEMY_GUILD_EMPTY	Keine
GUILD_INFO_LEVEL	Gilden-Level
GUILD_INFO_MARK	Gildenzeichen
GUILD_INFO_MASTER	Leader
GUILD_INFO_MASTER_VALUE	Leader
GUILD_INFO_MEMBER_AVG_LEVEL	Durchschnittliches Level
GUILD_INFO_MEMBER_NUM	Mitgliederzahl
GUILD_INFO_NAME	Gildenname
GUILD_INFO_NAME_VALUE	Dies ist ein Gildenname
GUILD_INFO_OFFER_EXP	Invest.
GUILD_INFO_REST_EXP	Nötige Erfahrung
GUILD_INFO_UPLOAD_MARK	Zeichen hochladen
GUILD_INFO_UPLOAD_SYMBOL	Flagge hochladen
GUILD_MARK	Gildenzeichen
GUILD_MASTER_CHANGE_TITLEBAR	Gildenleitung abgeben
GUILD_MEMBER_JOB	Klasse
GUILD_MEMBER_KNIGHT	Kämpfer
GUILD_MEMBER_LEVEL	Level
GUILD_MEMBER_NAME	Name
GUILD_MEMBER_OUT_TITLEBAR	Mitglied entfernen
GUILD_MEMBER_PACE_ATTENDANCE	Teilnahme ({0}/{1})
GUILD_MEMBER_RANK	Rang
GUILD_MEMBER_SPECIFIC_GRAVITY	Invest.
GUILD_METIN_STONE	Geiststein
GUILD_MINENAL	Mineral
GUILD_MONEY	Yang
GUILD_NAME	Gilde
GUILD_RESOURCE_INFO	Ressourceninformationen
GUILD_SKILLPAGE_LADDER	Rangpunkte
GUILD_SKILLPAGE_RANK	Rang
GUILD_SKILL_ACTIVE	Aktiv
GUILD_SKIlL_HEAL_GSP	Aufladen
GUILD_SKILL_PASSIVE	Passiv
GUILD_SKILL_POWER	Energie
GUILD_SKILL_STATE	Fertigkeit der Gilde
GUILD_SYMBOL	Gildenflagge
GUILD_WAR_ACCEPT	Gildenkriegserklärung annehmen
GUILD_WAR_ALLSCORE	Alle Kämpfe
GUILD_WAR_BATTLE_TYPE	Kampfart
GUILD_WAR_CTF	Flagge
GUILD_WAR_DECLARE	Gildenkrieg erklären
GUILD_WAR_ENEMY	Gegner
GUILD_WAR_GAINSCORE	Punkte
GUILD_WAR_GAINSCORE_FIFTY	50
GUILD_WAR_GAINSCORE_HUNDRED	100
GUILD_WAR_GAINSCORE_THIRTY	30
GUILD_WAR_GAMETIME	Kampfzeit
GUILD_WAR_GAMETIME_SIXTY	60 Min.
GUILD_WAR_GAMETIME_TEN	10 Min.
GUILD_WAR_GAMETIME_THIRTY	30 Min.
GUILD_WAR_JOINMEMBER	Mitglieder
GUILD_WAR_JOINMEMBER_COUNT	Mitglieder
GUILD_WAR_JOINMEMBER_FIFTEEN	15
GUILD_WAR_JOINMEMBER_FIVE	5
GUILD_WAR_JOINMEMBER_TEN	10
GUILD_WAR_NORMAL	Feld
GUILD_WAR_REPORT	Kriegsübersicht
GUILD_WAR_REPORTLIST	Übersicht (Kämpfe: K, Siege: S, Niederlagen: N, Unentschieden: U)
GUILD_WAR_SCORE	Kriegsübersicht
GUILD_WAR_SKILL	Gildenfertigkeiten
GUILD_WAR_TYPE_DEFENSE	Schildkampf
GUILD_WAR_TYPE_DIE	Arenakampf
GUILD_WAR_TYPE_FLAG	Flaggenkampf
GUILD_WAR_TYPE_NORMAL	Feldschlacht
GUILD_WAR_TYPE_TIGER	Vernichtungskampf
GUILD_WAR_TYPE_TIME	Zeitangriff
GUILD_WAR_WARP	Arena
GUILD_WAR_WIN	Runden
GUILD_WAR_WIN_FIVE	5
GUILD_WAR_WIN_ONE	1
GUILD_WAR_WIN_THREE	3
GUILD_WATER	Wasser
GUILD_WATER_STONE	Wasserstein
GUILD_WITHDRAW	Nehmen
HELP_ATTACK	Aktiviert den einmaligen Angriff per Mausklick.
HELP_ATTACK_KEY	Angreifen: linke Maustaste oder Leertaste
HELP_AUTO_ATTACK	Aktiviert den automatischen Angriff per Mausklick.
HELP_CAMERA	Kameraführung
HELP_CHANGE_PK_MODE	Angriffsmodus wechseln: Belegung der linken Maustaste ändern
HELP_CHARACTER_BUTTON1	(Charakterfenster, Inventarfenster,
HELP_CHARACTER_BUTTON2	Freundesliste und Optionen)
HELP_CHAT	Um mit entsprechenden Gruppen zu chatten, schreibe vor deinen Text: !(Rufchat), #(Gruppenchat) oder %(Gildenchat).
HELP_CLICK_OTHER_PLAYER	Mit Rechtsklick auf einen anderen Spieler kannst du handeln, Gruppen gründen und zu Duellen herausfordern.
HELP_CONTROL_CAMERA_BY_MIDDLEBUTTON	Voreinstellung Kamerasicht: mittlere Maustaste
HELP_CONTROL_CAMERA_BY_RIGHTBUTTON	Einstellung Kamerasicht ändern: rechte oder linke Maustaste belegen
HELP_EMOTINO	Mit der Tastenkombinationen <STRG> + <1~9> kannst du Emotionen zeigen.
HELP_EXP	Erfahrung
HELP_FURY	Ingame Item-Shop
HELP_GUILD_WINDOW	Gildenfenster öffnen: Alt + G
HELP_HELP	Hilfe anzeigen: H
HELP_HELP_KEY	Die Hilfe zeigt die Standardeinstellungen an.
HELP_HP	Trefferpunkte (TP)
HELP_KEYSETTING	Du kannst in den Spieloptionen deine eigenen Tastenkombinationen einstellen.
HELP_MESSENGER_WINDOW	Freundesliste öffnen: Alt + M
HELP_MINIMAP	Zeigt Minikarte an.
HELP_MINIMAP_QUEST	In der Mini- und Übersichtskarte werden dir Aufträge blinkend angezeigt.
HELP_MOUSE_LEFT	Funktion der linken Maustaste
HELP_MOUSE_RIGHT	Funktion der rechten Maustaste
HELP_MOVE_KEY	Steuerung: W, A, S, D oder Pfeiltasten
HELP_OFF_QUESTSCROLL	Mit <STRG> + Q kannst du die Questrollen ein- und ausblenden.
HELP_OPEN_CHARACTER	Charakterfenster öffnen: C
HELP_OPEN_CHAT	Chat-Fenster öffnen: Enter
HELP_OPEN_INVENTORY	Inventarfenster öffnen: I
HELP_OPEN_LOG	Chat-Protokoll (Log) öffnen: L
HELP_OPEN_MINIMAP	Minikarte öffnen: Shift + M
HELP_OPEN_QUEST	Auftragsfenster öffnen: N
HELP_OPEN_SKILL	Fertigkeitenfenster öffnen: V
HELP_OPEN_WHISPER	Flüsterfenster öffnen: Shift + Enter
HELP_OPEN_ZONEMAP	Übersichtskarte öffnen: M
HELP_PICK_ITEM	Gegenstände aufheben: ^ oder Y oder linke Maustaste
HELP_QUICKSLOT	Schnellzugriffsfelder
HELP_SCREEN_CAPTURE	Screenshot speichern: Druck bzw. Print (Speicherort ist der Ordner "Metin2\screenshot")
HELP_SERVER	Zeigt dir Server und Channel an.
HELP_SHOW_ALL_NAME	Namen anzeigen: Alt
HELP_SKILL	Hier kannst du eine Fertigkeit mit der rechten Maustaste nutzen.
HELP_SP	Manapunkte (MP)
HELP_SYSTEM_BUTTON	Systemtasten
INVENTORY_PAGE_BUTTON_TOOLTIP_1	1. Inventar
INVENTORY_PAGE_BUTTON_TOOLTIP_2	2. Inventar
INVENTORY_PAGE_BUTTON_TOOLTIP_3	3. Inventar
INVENTORY_PAGE_BUTTON_TOOLTIP_4	4. Inventar
INVENTORY_TITLE	Inventar
ITEM_MALL	Item-Shop
KEYCHANGE_ACTION_WINDOW	Aktionen
KEYCHANGE_ATTACK	Angreifen
KEYCHANGE_AUTORUN	Autom. laufen
KEYCHANGE_AUTO_WINDOW	Autojagd
KEYCHANGE_BASEACTION	Grundeinstellungen
KEYCHANGE_CAM_DOWN1	Kamera (runter)
KEYCHANGE_CAM_DOWN2	Kamera (runter)
KEYCHANGE_CAM_LEFT1	Kamera (links)
KEYCHANGE_CAM_LEFT2	Kamera (links)
KEYCHANGE_CAM_RIGHT1	Kamera (rechts)
KEYCHANGE_CAM_RIGHT2	Kamera (rechts)
KEYCHANGE_CAM_UP1	Kamera (hoch)
KEYCHANGE_CAM_UP2	Kamera (hoch)
KEYCHANGE_CAM_ZOOM_IN1	Kamera (Zoom +)
KEYCHANGE_CAM_ZOOM_IN2	Kamera (Zoom +)
KEYCHANGE_CAM_ZOOM_OUT1	Kamera (Zoom -)
KEYCHANGE_CAM_ZOOM_OUT2	Kamera (Zoom -)
KEYCHANGE_CANCLE	Abbrechen
KEYCHANGE_CHAT_WINDOW	Chat-Protokoll
KEYCHANGE_CLEAR	Standard
KEYCHANGE_DDS_WINDOW	DSS
KEYCHANGE_DOWN1	Rückwärts
KEYCHANGE_DOWN2	Rückwärts
KEYCHANGE_DSS1	DS [Himmel]
KEYCHANGE_DSS2	DS [Erde]
KEYCHANGE_EMOTION1	Emotion (traurig)
KEYCHANGE_EMOTION2	Emotion (Yang)
KEYCHANGE_EMOTION3	Emotion (Musik)
KEYCHANGE_EMOTION4	Emotion (Herz)
KEYCHANGE_EMOTION5	Emotion (Herzchen)
KEYCHANGE_EMOTION6	Emotion (Bombe)
KEYCHANGE_EMOTION7	Emotion (Einfall)
KEYCHANGE_EMOTION8	Emotion (Gewitter)
KEYCHANGE_EMOTION9	Emotion (Sorry)
KEYCHANGE_GUILD_WINDOW	Gilde
KEYCHANGE_HELP_WINDOW	Hilfe
KEYCHANGE_IMPOSSIBLE_CHANGE	[STRG], [ALT], [UMSCHALT] sind hier nicht erlaubt!
KEYCHANGE_INGAMEEVENT	EVENT
KEYCHANGE_INTERFACE	Fenster
KEYCHANGE_INVENTORY_WINDOW	Inventar
KEYCHANGE_KEY_SETTING	Tastatureinstellungen
KEYCHANGE_LEFT1	Links
KEYCHANGE_LEFT2	Links
KEYCHANGE_MESSENGER_WINDOW	Freunde
KEYCHANGE_MINIMAP_MINER	Minimap (-)
KEYCHANGE_MINIMAP_PLUS	Minimap (+)
KEYCHANGE_MINIMAP_WINDOW	Übersichtskarte
KEYCHANGE_MONSTER_CARD_WINDOW	Monsterkarte
KEYCHANGE_NEXT_TARGET	Nächstes Ziel
KEYCHANGE_PARTY_MATCH_WINDOW	Gruppensuche
KEYCHANGE_PASSIVE_ATTR1	Reliktbonus (Himmel)
KEYCHANGE_PASSIVE_ATTR2	Reliktbonus (Erde)
KEYCHANGE_PET_WINDOW	Pet
KEYCHANGE_QUEST_SCROLL_ONOFF	Questanzeige
KEYCHANGE_QUEST_WINDOW	Missionen
KEYCHANGE_QUICKSLOT1	Ebene 1
KEYCHANGE_QUICKSLOT2	Ebene 2
KEYCHANGE_QUICKSLOT3	Ebene 3
KEYCHANGE_QUICKSLOT4	Ebene 4
KEYCHANGE_RIDE	Reiten
KEYCHANGE_RIDE_BYE	Pferd wegschicken
KEYCHANGE_RIDE_HORSE	Reiten
KEYCHANGE_RIDE_PEED	Pferd füttern
KEYCHANGE_RIGHT1	Rechts
KEYCHANGE_RIGHT2	Rechts
KEYCHANGE_ROOT1	Aufheben
KEYCHANGE_ROOT2	Aufheben
KEYCHANGE_SAVE	Speichern
KEYCHANGE_SCREENSHOT	Schnappschuss
KEYCHANGE_SHOW_NAME	Namen anzeigen
KEYCHANGE_SKILL_WINDOW	Fertigkeiten
KEYCHANGE_SLOT1	Slot 1
KEYCHANGE_SLOT2	Slot 2
KEYCHANGE_SLOT3	Slot 3
KEYCHANGE_SLOT4	Slot 4
KEYCHANGE_SLOT5	Slot 5
KEYCHANGE_SLOT6	Slot 6
KEYCHANGE_SLOT7	Slot 7
KEYCHANGE_SLOT8	Slot 8
KEYCHANGE_SLOT_KET	Schnellzugriff
KEYCHANGE_STATUS_WINDOW	Charakter
KEYCHANGE_UP1	Vorwärts
KEYCHANGE_UP2	Vorwärts
LANGUAGE_AE	Arabisch
LANGUAGE_CZ	Tschechisch
LANGUAGE_DE	Deutsch
LANGUAGE_DK	Dänisch
LANGUAGE_EN	Englisch
LANGUAGE_ES	Spanisch
LANGUAGE_FR	Französisch
LANGUAGE_GR	Griechisch
LANGUAGE_HU	Ungarisch
LANGUAGE_IT	Italienisch
LANGUAGE_NL	Niederländisch
LANGUAGE_PL	Polnisch
LANGUAGE_PT	Portugiesisch
LANGUAGE_RO	Rumänisch
LANGUAGE_RU	Russisch
LANGUAGE_TR	Türkisch
LOAD_ERROR	Die Datendatei ist beschädigt. Bitte Client neu installieren. Drücke jetzt die Taste ESC.
LOGIN_CONNECT	Verbinden
LOGIN_CONNECTING	Du wirst mit dem Server verbunden.
LOGIN_DEFAULT_SERVERADDR	Servername, Channel 1
LOGIN_EXIT	Beenden
LOGIN_ID	Benutzername
LOGIN_PASSWORD	Passwort
LOGIN_REGION_TITLE	Ort für die Rechnungsstellung wählen
LOGIN_SELECT_BUTTON	Wählen
LOGIN_SELECT_EXIT	Beenden
LOGIN_SELECT_OK	OK
LOGIN_SELECT_TITLE	Server wählen
LUCKY_BOX_NOTICE_YANG	Yang-Gebühr für neues Item-Glück
LUCKY_BOX_RECV_BUTTON	Item annehmen
LUCKY_BOX_RECV_NAME	Inhalt:
LUCKY_BOX_RETRY_BUTTON	Neues Item-Glück
LUCKY_BOX_TITLE_NAME	Glückskistchen
MAILBOX_POST_ALL_DELETE_BUTTON	Alle löschen
MAILBOX_POST_ALL_RECEIVE	Alle annehmen
MAILBOX_POST_READ_BLOCK	Blockieren
MAILBOX_POST_READ_DELETE	Löschen
MAILBOX_POST_READ_FROM	Von
MAILBOX_POST_READ_MAIN_TITLE	Nachricht
MAILBOX_POST_READ_RECV	Annehmen
MAILBOX_POST_READ_TITLE	Betreff
MAILBOX_POST_SEND_TITLE	Nachricht
MAILBOX_POST_WRITE_BUTTON_TEXT	Senden
MAILBOX_POST_WRITE_CLOSE_TEXT	Schließen
MAILBOX_POST_WRITE_CONFIRM_TEXT	Empfänger prüfen
MAILBOX_POST_WRITE_SEND_TEXT	Senden
MAILBOX_POST_WRITE_TITLE	Betreff
MAILBOX_POST_WRITE_TO	An
MAILBOX_TITLE	Posteingang
MALL_PASSWORD_TITLE	Passwort
MALL_TITLE	Itemshop-Lager
MARKET_TITLE	Laden
MARKLIST_REFRESH	Aktualisieren
MARKLIST_TITLE	Gildenzeichen registrieren
MC_ACHIEV_ABLE_REGIST	Einfordern
MC_ACHIEV_APPLY	Anwenden
MC_ACHIEV_APPLYING	Aktiv
MC_ACHIEV_BONUS_NONE	Kein Bonus
MC_ACHIEV_DISABLE	Inaktiv
MC_ACHIEV_DUNGEON	Dungeon-Erfolge
MC_ACHIEV_DUNGEON_BONUS	Dungeon-Bonus
MC_ACHIEV_FIELD	Feld-Erfolge
MC_ACHIEV_FIELD_BONUS	Feld-Bonus
MC_ACHIEV_REGIST	Erfolg einfordern
MC_ACHIEV_SHOW	Details
MC_ACHIEV_SORT_ABLE_REGIST	Einfordern
MC_ACHIEV_SORT_ALL	Alle
MC_ACHIEV_SORT_APPLYING	Aktiv
MC_ACHIEV_SORT_DISABLE	Unerreicht
MC_ACHIEV_SORT_REGIST	Aktivierbar
MC_EXCHANGE_BUTTON	Austauschen
MC_MISSION_INIT_BUTTON	Missionsstufe zurücksetzen
MC_MOTION_BUTTON	Bewegung
MC_POLY_BUTTON	Verwandeln
MC_PROMOTION_BUTTON	Verbessern
MC_REQUEST_MISSION_BUTTON	Mission erhalten
MC_REWARD_CARD_BUTTON	Monsterkarte erhalten
MC_SHUFFLE_BUTTON	Missionskarten neu anordnen
MC_SUMMON_BUTTON	Beschwören
MC_TAB_BUTTON_ACHIEV	Erfolgs-Boni
MC_TAB_BUTTON_CARD_MISSION	Kartenmission
MC_TAB_BUTTON_PARTY	Dungeon-Sammlung
MC_TAB_BUTTON_SOLO	Feldsammlung
MC_WARP_BUTTON	Teleportieren
MESSAGE	Dies ist eine Nachricht
MESSENGER_ADD_FRIEND	Freund hinzufügen
MESSENGER_BLOCK_FRIEND	Blockieren
MESSENGER_DELETE_FRIEND	Löschen
MESSENGER_MOBILE	SMS senden
MESSENGER_OPEN_GUILD	Gildenfenster öffnen
MESSENGER_TITLE	Freunde
MESSENGER_USE_GUILD_MOVE_SKILL	Verwende die Gildenbewegungsfertigkeit
MESSENGER_WHISPER	Flüstern
MINIGAME_FISH_EVENT_USE_COUNT	Anzahl
MINIMIZE	Minimieren
MINI_BOSS_DUNGEON_DESC_BTN	Eventregeln
MINI_BOSS_DUNGEON_TITLE_NAME	Teilnehmer
MINI_BOSS_DUNGEON_TITLE_NUM	Rang
MINI_BOSS_DUNGEON_TITLE_POINT	Apokalypsenpunkte
MINI_BOSS_DUNGEON_TOOTIP_01	Dungeon-Übersicht
MINI_BOSS_DUNGEON_TOOTIP_02	Apokalypse für Level 40 bis 80
MINI_BOSS_DUNGEON_TOOTIP_03	Apokalypse ab Level 81
MINI_BOSS_DUNGEON_TOOTIP_04	Betreten
MINI_BOSS_DUNGEON_TOOTIP_05	Verbleibende Zeit
MINI_BOSS_DUNGEON_TOOTIP_06	Meine Apokalypsenpunkte
MINI_BOSS_DUNGEON_TOOTIP_07	Verbleibende Apokalypsen
MINI_BOSS_DUNGEON_TOOTIP_08	Meine Belohnung
MINI_BOSS_TITLE	Zodiak-Apokalypse
MINI_GAME_BLACK_AND_WHITE_DONATE	Spenden
MINI_GAME_BLACK_AND_WHITE_GAME_TITLE	Seherwettstreit
MINI_GAME_BLACK_AND_WHITE_RANK_BUTTON	Rangliste
MINI_GAME_BLACK_AND_WHITE_REWARD_TRADE	Preise
MINI_GAME_BLACK_AND_WHITE_START_BUTTON	Start
MINI_GAME_BLACK_AND_WHITE_WAITTING_TITLE	Seherwettstreit
MINI_GAME_CATCHKING_CHALLENGE	Einsatz
MINI_GAME_CATCHKING_HELP_TEXT	Regeln
MINI_GAME_CATCHKING_HIGH_SCORE	High Score
MINI_GAME_CATCHKING_MYNUMBER	Meine Karte
MINI_GAME_CATCHKING_POPUP_CONFIRM	Pop-Up an/aus
MINI_GAME_CATCHKING_RETRY	Neu spielen
MINI_GAME_CATCHKING_REWARD	Dein Gewinn
MINI_GAME_CATCHKING_SCORE	Punkte
MINI_GAME_CATCHKING_SELECTION_NUMBER	Aufgedeckte Karte
MINI_GAME_CATCHKING_START_TEXT	Start
MINI_GAME_CATCHKING_TITLE	Schnapp den König
MINI_GAME_FISH_HELP_TEXT	Hilfe
MINI_GAME_FISH_START_TEXT	Start
MINI_GAME_FISH_TITLE	Fischpuzzlespiel
MINI_GAME_RUMI_DISCARD_TEXT	Sicherer Modus
MINI_GAME_RUMI_EXIT	Beenden
MINI_GAME_RUMI_LBUTTON_DESC	Karte mit Linksklick hinzufügen
MINI_GAME_RUMI_RBUTTON_DESC	Karte mit Rechtsklick entfernen
MINI_GAME_RUMI_SCORE	Punkte
MINI_GAME_RUMI_START_TEXT	Start
MINI_GAME_RUMI_TITLE	Metin2 Okey-Kartenspiel
MINI_GAME_YUTNORI_COM_TEXT	Computer
MINI_GAME_YUTNORI_PLAYER_TEXT	Spieler
MINI_GAME_YUTNORI_PROBABILITY	Wahrscheinlichkeit
MINI_GAME_YUTNORI_PROB_DESC	Wähle einen Yut-Wurf aus, um ihm eine höhere Wahrscheinlichkeit zu verleihen.
MINI_GAME_YUTNORI_REMAIN_COUNT	Züge
MINI_GAME_YUTNORI_REWARD_TEXT	Belohnung
MINI_GAME_YUTNORI_SCORE	Punktestand
MINI_GAME_YUTNORI_START_TEXT	Start
MINI_GAME_YUTNORI_THROW	Werfen
MINI_GAME_YUTNORI_TITLE	Yutnori
MINI_GAME_YUTNORI_YUTSEM1	Do
MINI_GAME_YUTNORI_YUTSEM2	Ge
MINI_GAME_YUTNORI_YUTSEM3	Geol
MINI_GAME_YUTNORI_YUTSEM4	Yut
MINI_GAME_YUTNORI_YUTSEM5	Mo
MINI_GAME_YUTNORI_YUTSEM6	Back-do
MISTS_ISLAND_EMPIRE_NAME	Name des Reiches
MISTS_ISLAND_EMPIRE_SCORE	Punktzahl des Reiches
MISTS_ISLAND_END_TIME	Enddatum
MISTS_ISLAND_EXIT	Verlassen
MISTS_ISLAND_INFO_TEXT	Rang- und Statusinfo
MISTS_ISLAND_RANK	Rang
MISTS_ISLAND_SCORE	Punktzahl
MISTS_ISLAND_TITLE_RANK	Info zu Rang und Status
MISTS_ISLAND_TITLE_SCORE	Überblick
MONSTER_CARD_ACHIEV_BONUS	Erfolge
MOUSEBUTTON_ATTACK	Angreifen
MOUSEBUTTON_AUTO_ATTACK	Automatisch angreifen
MOUSEBUTTON_CAMERA	Kamera
MOUSEBUTTON_SKILL	Fertigkeiten
MUSICLIST_TITLE	Musikauswahl
MYSHOP_DECO_CANCEL	Schließen
MYSHOP_DECO_DEFAULT	Standard
MYSHOP_DECO_NEXT	Weiter
MYSHOP_DECO_OK	Abschließen
MYSHOP_DECO_PREV	Zurück
MYSHOP_DECO_SELECT_MODEL	Wähle das Aussehen deines Shops aus.
MYSHOP_DECO_SELECT_TITLE	Wähle das Aussehen deines Titels aus.
NO	Nein
OK	OK
OPPOSITES	Ablehnen
OPTION_ALWAYS_SHOW_NAME	Name
OPTION_ALWAYS_SHOW_NAME_OFF	Begrenzt
OPTION_ALWAYS_SHOW_NAME_ON	Immer
OPTION_BLOCK	Abblocken
OPTION_BLOCK_EXCHANGE	Handeln
OPTION_BLOCK_FRIEND	Freunde
OPTION_BLOCK_GUILD	Gilde
OPTION_BLOCK_PARTY	Gruppe
OPTION_BLOCK_PARTY_REQUEST	Anfrage
OPTION_BLOCK_WHISPER	Flüstern
OPTION_CAMERA_DISTANCE	Kamera
OPTION_CAMERA_DISTANCE_LONG	Fern
OPTION_CAMERA_DISTANCE_SHORT	Nah
OPTION_DELETE_MOBILE_BUTTON	Handynummer löschen
OPTION_EFFECT	Trefferanzeige
OPTION_ENV_EFFECT	Umwelt
OPTION_ENV_EFFECT_OFF	Aus
OPTION_ENV_EFFECT_ON	An
OPTION_FOG	Nebel
OPTION_FOG_DENSE	Viel
OPTION_FOG_LIGHT	Wenig
OPTION_FOG_MIDDLE	Mittel
OPTION_FOG_OFF	Aus
OPTION_FOG_ON	An
OPTION_INPUT_MOBILE_BUTTON	Handynummer eingeben
OPTION_KEY_SETTING	Tastatur
OPTION_LANGUAGE_CHANGE	Anwenden
OPTION_LANGUAGE_SELECT	Sprache
OPTION_MOBILE	Handy
OPTION_MOB_INFO	Monsterinfo
OPTION_MOB_INFO_AGGR	Aggressiv
OPTION_MOB_INFO_LEVEL	Level
OPTION_MUSIC	Musik
OPTION_MUSIC_CHANGE	Wechseln
OPTION_MUSIC_DEFAULT_THEMA	Standardtitel von Metin2
OPTION_NAME_COLOR	Farbe Name
OPTION_NAME_COLOR_EMPIRE	Reichsfarbe
OPTION_NAME_COLOR_NORMAL	Normal
OPTION_NIGHT_MODE	Nacht
OPTION_NIGHT_MODE_OFF	Aus
OPTION_NIGHT_MODE_ON	An
OPTION_PVPMODE	PvP-Modus
OPTION_PVPMODE_FREE	Frei
OPTION_PVPMODE_FREE_TOOLTIP	Du darfst alle Spieler angreifen.
OPTION_PVPMODE_GUILD	Gilde
OPTION_PVPMODE_GUILD_TOOLTIP	Du darfst alle Spieler mit Ausnahme von Gildenmitgliedern angreifen.
OPTION_PVPMODE_PEACE	Frieden
OPTION_PVPMODE_PEACE_TOOLTIP	Du darfst keine Spieler deines Reiches angreifen.
OPTION_PVPMODE_REVENGE	Feindlich
OPTION_PVPMODE_REVENGE_TOOLTIP	Du darfst nur Spieler mit einer anderen Gesinnung angreifen.
OPTION_SALESTEXT	Ladenname
OPTION_SALESTEXT_VIEW_OFF	Ausblenden
OPTION_SALESTEXT_VIEW_ON	Einblenden
OPTION_SETTING	Öffnen
OPTION_SNOW_MODE	Schneefall
OPTION_SNOW_MODE_OFF	Aus
OPTION_SNOW_MODE_ON	An
OPTION_SNOW_TEXTURE_MODE	Schnee
OPTION_SNOW_TEXTURE_MODE_OFF	Aus
OPTION_SNOW_TEXTURE_MODE_ON	An
OPTION_SOUND	Effekte
OPTION_TARGET_BOARD	Zielmenü
OPTION_TARGET_BOARD_NO_VIEW	Schließen
OPTION_TARGET_BOARD_VIEW	Anzeigen
OPTION_TITLE	Optionen
OPTION_VIEW_CHAT	Chatzeile
OPTION_VIEW_CHAT_OFF	Ausblenden
OPTION_VIEW_CHAT_ON	Einblenden
PARTY_MATCH_TEXT_DUNGEON_NAME	Dungeon
PARTY_MATCH_TEXT_DUNGEON_SELECT	Wähle Dungeon
PARTY_MATCH_TEXT_ENTREE_LEVEL	Level : %d
PARTY_MATCH_TEXT_LEVEL_LIMIT	Levelanforderung
PARTY_MATCH_TEXT_REQUEST_MATCH	Suchen
PARTY_MATCH_TEXT_REQUEST_MATCH_CANCEL	Abbrechen
PARTY_MATCH_TEXT_REQUIRED_ITEMS	Itemanforderung
PARTY_MEMBER_INFO_NAME	Name des Gruppenmitglieds
PASSIVE_ATTR_ACTIVATE_BUTTON	Aktivieren
PASSIVE_ATTR_UI_ADD_BUTTON	Hinzufügen
PASSIVE_ATTR_UI_CHARGE_BUTTON	Aufladen
PASSIVE_ATTR_UI_TITLE	Reliktbonus
PASSWORD_DESC_1	Gib dein Passwort ein,
PASSWORD_DESC_2	um das Lager zu öffnen.
PASSWORD_DESC_3	Passwort schon geändert?
PASSWORD_DESC_4	Wenn nicht, ist dein Passwort: "000000".
PASSWORD_DESC_5	Ändere dein Passwort im Lager.
PASSWORD_TITLE	Speicher-PW
PET_AGE_TEXT	Alter des Pets
PET_ATTR_CHANGE_ITEM_TEXT	Pet verzaubern
PET_ATTR_CHANGE_TITLE	Pettyp ändern
PET_ATTR_CONFIRMATION	Ändern
PET_ATTR_DETERMINE_TITLE	Neuer Pettyp
PET_ATTR_OK	Schließen
PET_CHANGE_TEXT	Pet
PET_FEED_TITLE	Füttern
PET_FFED_BUTTON_TEXT	Füttern
PET_HATCHING_BUTTON	Ausbrüten
PET_HATCHING_NIK	Name des Pets
PET_HATCHING_WINDOW_TITLE	Brutkasten
PET_INFORMATION_ABILITIES	Boni
PET_INFORMATION_AGE	Alter
PET_INFORMATION_COSTUME_BONUS	Kostümbonus
PET_INFORMATION_DEFENCE	Verteidigung
PET_INFORMATION_EVOL_BUTTON	Entwicklung
PET_INFORMATION_EXP	Erfahrung
PET_INFORMATION_EXP_BUTTON	Item EXP
PET_INFORMATION_HP	TP
PET_INFORMATION_LEVEL	Level
PET_INFORMATION_LIFE	Laufzeit
PET_INFORMATION_LIFETIME_BUTTON	Füttern
PET_INFORMATION_LIFE_TIME	Stunden
PET_INFORMATION_SKILL	Fertigkeiten
PET_INFORMATION_SP	MP
PET_INFORMATION_TITLE	Pet
PET_NAME_CHANGE_BUTTON	Ändern
PET_NAME_CHANGE_WINDOW_TITLE	Name ändern
PET_REVIVE_BUTTON	Wiederbeleben
PET_REVIVE_CANCEL_BUTTON	Abbrechen
PET_REVIVE_MATERIAL_TITLE	Material
PET_REVIVE_REUSLT_TEXT	Ergebnis
PET_REVIVE_TARGET	Wiederzubelebendes Pet
PET_REVIVE_TITLE	Pet wiederbeleben
PICK_MONEY_TITLE	Teilen
PRIVATESHOPSEARCH_BUY	Kaufen
PRIVATESHOPSEARCH_COUNT	Anzahl
PRIVATESHOPSEARCH_ITEMNAME	Name
PRIVATESHOPSEARCH_ITEMTYPE	Gegenstände
PRIVATESHOPSEARCH_JOB	Klasse
PRIVATESHOPSEARCH_LEVEL	Level
PRIVATESHOPSEARCH_PRICE	Preis
PRIVATESHOPSEARCH_REFINE	Gegenstandsstufe
PRIVATESHOPSEARCH_SEARCH	Suchen
PRIVATESHOPSEARCH_SEARCH_BAR	Suchen
PRIVATESHOPSEARCH_SELECT	Auswählen
PRIVATESHOPSEARCH_SELLER	Verkäufer
PRIVATE_SHOP_CLOSE_BUTTON	Laden schließen
PRIVATE_SHOP_NAME	Name des Ladens
PRIVATE_SHOP_SEARCH_BY_VNUM_BOARD_TITLE	Alle Ergebnisse
PRIVATE_SHOP_SEARCH_BY_VNUM_CANCEL_BUTTON_TEXT	Abbrechen
PRIVATE_SHOP_SEARCH_BY_VNUM_SEARCH_BUTTON_TEXT	Suchen
PRIVATE_SHOP_TITLE	Privaten Laden einrichten
QUEST_UI_TEXT_COLLECTION	Biologenaufträge
QUEST_UI_TEXT_DAILY	Tägliche Quest
QUEST_UI_TEXT_EVENT	Eventmissionen
QUEST_UI_TEXT_LEVELUP	Jagdauftrag
QUEST_UI_TEXT_MAIN	Hauptquests
QUEST_UI_TEXT_SCROLL	Missionsbücherquests
QUEST_UI_TEXT_SUB	Nebenquests
QUEST_UI_TEXT_SYSTEM	Spielmissionen
REFINE_COST	Verbesserungskosten: 0 Yang
REFINE_ELEMENT_CHANGE_COST_TITLE	Kosten
REFINE_ELEMENT_CHANGE_DARK	Dunkelheit
REFINE_ELEMENT_CHANGE_EARTH	Erde
REFINE_ELEMENT_CHANGE_ELECT	Blitz
REFINE_ELEMENT_CHANGE_FIRE	Feuer
REFINE_ELEMENT_CHANGE_ICE	Eis
REFINE_ELEMENT_CHANGE_TITLE	Element ändern
REFINE_ELEMENT_CHANGE_WIND	Wind
REFINE_ELEMENT_DOWNGRADE_TITLE	Herabstufung
REFINE_ELEMENT_UPGRADE_TITLE	Verbesserung
REFINE_INFO	Wahrscheinlichkeit auf erfolgreiche Verbesserung: 100%
REFINE_MONEY	Veredelungsgebühr
REFINE_SELECT	Veredelung
REFINE_TTILE	Verbesserungen
REPORT_VIOLENT_WHISPER	Petzen
RESTART_GIVEUP	Aufgeben
RESTART_HERE	Hier neu starten
RESTART_IMMEDIATE	Reinkarnation
RESTART_TOWN	In der Stadt neu starten
ROULETTE_SPECIAL_TITLE	Belohnungen (%s)
ROULETTE_SPIN_TEXT1	DREHEN
ROULETTE_SPIN_TEXT2	50 Seelen
ROULETTE_SPIN_TEXT3	250.000 Yang
ROULETTE_TITLE	Belohnungen
SAFE_CHANGE_PASSWORD	Passwort ändern
SAFE_TITLE	Lager
SELECT_ATTR_CHANGED	Neu
SELECT_ATTR_CURRENT	Alt
SELECT_ATTR_SELECT	Auswählen
SELECT_ATTR_TITLE	Gegenstand verzaubern+
SELECT_ATT_GRADE	STR
SELECT_CREATE	Erstellen
SELECT_DELETE	Löschen
SELECT_DEX_GRADE	DEX
SELECT_EMPIRE_NAME	Name des Reiches
SELECT_EXIT	Beenden
SELECT_HP	VIT
SELECT_LEVEL	Level
SELECT_METIN_STONE_TITLE	Geiststein wählen
SELECT_NAME	Name
SELECT_NO_GUILD	Keine Gilde
SELECT_ORIGIN_STAT	Startpunkt
SELECT_PLAYTIME	Spielzeit
SELECT_SELECT	Start
SELECT_SP	INT
SELECT_SUNGMA_STAT	SungMa-Wille
SELECT_TITLE	Titel auswählen
SHOP_BUY	Kaufen
SHOP_SELL	Verkaufen
SHOP_TITLE	Laden
SKILL_SUPPORT_TITLE	Standardfertigkeiten
STEP	Reinheitsgrad
STEP_SELECT	Reinheitsgrad
STRENGTH	Verstärken
STRENGTH_SELECT	Stufe
STRUCTURE_VIEW_MODE	Dekoration
STRUCTURE_VIEW_TYPE_STRUCTURE	Verbergen
SUNGHAHEE_TOWER_CLEAR	Geschafft
SUNGMAHEE_TOWER_DUNGEON_ENTER_QUESTION	Willst du Ebene %d betreten?
SUNGMAHEE_TOWER_DUNGEON_EXIT_QUESTION	Willst du die Herausforderung abbrechen?
SUNGMAHEE_TOWER_ELEMENT_ALL	Alle
SUNGMAHEE_TOWER_ELEMENT_DARK	Dunkelheit
SUNGMAHEE_TOWER_ELEMENT_EARTH	Erde
SUNGMAHEE_TOWER_ELEMENT_ELEC	Blitz
SUNGMAHEE_TOWER_ELEMENT_FIRE	Feuer
SUNGMAHEE_TOWER_ELEMENT_ICE	Eis
SUNGMAHEE_TOWER_ELEMENT_TITLE	Elemente auf der Ebene
SUNGMAHEE_TOWER_ELEMENT_WIND	Wind
SUNGMAHEE_TOWER_ENTER_BUTTON	Betreten
SUNGMAHEE_TOWER_ENTER_TITLE	Sung Mahis Höllenturm
SUNGMAHEE_TOWER_EXIT_BUTTON	Verlassen
SUNGMAHEE_TOWER_INFO_BOARD_FLOOR	E%d
SUNGMAHEE_TOWER_MISSION_TYPE_ALL_KILL_MOB_PAUSE_SPECIAL	Besiege alle Monster und Dämonensteine!
SUNGMAHEE_TOWER_MISSION_TYPE_BOSS	Töte alle Monster!
SUNGMAHEE_TOWER_MISSION_TYPE_CHESS_FAIL	Töte alle Monster!
SUNGMAHEE_TOWER_MISSION_TYPE_COMPLETE	Mission erfüllt
SUNGMAHEE_TOWER_MISSION_TYPE_CORRECT_ITEM_USE	Finde den Schlüssel und entkomme!
SUNGMAHEE_TOWER_MISSION_TYPE_DEBUFF_RELEASE	Töte alle Monster!
SUNGMAHEE_TOWER_MISSION_TYPE_FINDING_RIGHT_MATCH_METIN_STONE	Zerstöre den verfluchten Metin!
SUNGMAHEE_TOWER_MISSION_TYPE_FINDING_RIGHT_MATCH_METIN_STONE_FAIL	Töte alle Monster!
SUNGMAHEE_TOWER_MISSION_TYPE_MONSTER_CHESS	Töte ein Monsterpaar, das nicht zusammengehört!
SUNGMAHEE_TOWER_MISSION_TYPE_NORMAL	Töte alle Monster!
SUNGMAHEE_TOWER_MISSION_TYPE_SEAL_RELEASE	Brich die Siegel mit dem Siegelstein!
SUNGMAHEE_TOWER_MISSION_TYPE_STAIRS	Erklimme die Stufen zur nächsten Ebene!
SUNGMAHEE_TOWER_MISSION_TYPE_SURVIVE	Weiche allen Attacken aus!
SUNGMAHEE_TOWER_MY_RANK_TITLE	Rang
SUNGMAHEE_TOWER_REWARD_INFO_TITLE	Belohnungen
SYSTEMOPTION_TITLE	Systemoptionen
SYSTEM_CHANGE	Charakter wechseln
SYSTEM_EXIT	Spiel beenden
SYSTEM_HELP	Hilfe
SYSTEM_LOGOUT	Ausloggen
SYSTEM_MALL	Item-Shop
SYSTEM_MOVE_CHANNEL	Channel wechseln
SYSTEM_OPTION	Systemoptionen
TASKBAR_CHARACTER	Charakter [C/V/B/N]
TASKBAR_CHAT	Chat-Fenster [Enter]
TASKBAR_DISABLE	Deaktiviert
TASKBAR_DRAGON_SOUL	Drachensteinalchemie
TASKBAR_EXPAND	Fenster vergrößern
TASKBAR_INVENTORY	Inventar [I]
TASKBAR_MESSENGER	Freunde [Alt+M]
TASKBAR_MONEY_EXPAND	Vermögen
TASKBAR_NEXT_QUICKSLOT	Nächstes Schnellzugriffsfeld [Umschalt+Zahl, Alt]
TASKBAR_PET_INFO	Pet Info
TASKBAR_PREV_QUICKSLOT	Vorheriges Schnellzugriffsfeld [Umschalt+Zahl]
TASKBAR_SYSTEM	Optionen[ESC]
TOTAL_RANKING	Gesamtrangliste
WARP_MI_LABEL	Zum angegriffenen Schrein
WEEKLY_RANKING	Wöchentliche Rangliste
WHISPER_BAN	Abblocken
WHISPER_NAME	Zuflüstern
WHISPER_REPORT	report
WHISPER_SEND	Senden
WORLD_BOSS_BREAK_TIME_TEXT	Abklingzeit
WORLD_BOSS_MIN_DAMAGE_TEXT	Erf. Mindestschaden
WORLD_BOSS_RANK	Weltboss-Rangliste
WORLD_BOSS_RANKING_BUTTON	Rangliste
WORLD_BOSS_RANK_EMPIRE	Reich
WORLD_BOSS_RANK_GUILD_NAME	Gilde
WORLD_BOSS_RANK_NAME	Name
WORLD_BOSS_RANK_RANK	Rang
WORLD_BOSS_RANK_TIER	Beutestufe
WORLD_BOSS_RUN_TIME_TEXT	Kampfzeit
WORLD_BOSS_TITLE	Weltboss besiegt
WORLD_BOSS_TOTAL_DAMAGE_TEXT	Gesamtschaden
WORLD_BUSS_REWARD_BUTTON	Belohnung abholen
YES	Ja
ZONE_MAP	Übersichtskarte
LOGIN_SAVE_BUTTON	Save
LOGIN_LOAD_BUTTON	Load

 

 

please, can you help me? or did you have any other interface that works with this client?

 

Link to comment
Share on other sites



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.