diff --git a/assets/root/constinfo.py b/assets/root/constinfo.py index d8f5ecfa..c4de3e95 100644 --- a/assets/root/constinfo.py +++ b/assets/root/constinfo.py @@ -206,36 +206,36 @@ def GET_ACCESSORY_MATERIAL_VNUM(vnum, subType): return ACCESSORY_MATERIAL_LIST[type] ################################################################## -## 새로 추가된 '벨트' 아이템 타입과, 벨트의 소켓에 꽂을 아이템 관련.. -## 벨트의 소켓시스템은 악세서리와 동일하기 때문에, 위 악세서리 관련 하드코딩처럼 이런식으로 할 수밖에 없다.. +## Belt item type and belt socket item handling +## Belt socket system is identical to accessories, so must use hardcoding approach similar to accessory handling def GET_BELT_MATERIAL_VNUM(vnum, subType = 0): - # 현재는 모든 벨트에는 하나의 아이템(#18900)만 삽입 가능 + # Currently all belts can only insert one item type (#18900) return 18900 ################################################################## -## 자동물약 (HP: #72723 ~ #72726, SP: #72727 ~ #72730) +## Auto-potions (HP: #72723 ~ #72726, SP: #72727 ~ #72730) -# 해당 vnum이 자동물약인가? +# Check if vnum is an auto-potion def IS_AUTO_POTION(itemVnum): return IS_AUTO_POTION_HP(itemVnum) or IS_AUTO_POTION_SP(itemVnum) -# 해당 vnum이 HP 자동물약인가? +# Check if vnum is an HP auto-potion def IS_AUTO_POTION_HP(itemVnum): if 72723 <= itemVnum and 72726 >= itemVnum: return 1 - elif itemVnum >= 76021 and itemVnum <= 76022: ## 새로 들어간 선물용 화룡의 축복 + elif itemVnum >= 76021 and itemVnum <= 76022: ## Gift item: Fire Dragon's Blessing return 1 elif itemVnum == 79012: return 1 return 0 -# 해당 vnum이 SP 자동물약인가? +# Check if vnum is an SP auto-potion def IS_AUTO_POTION_SP(itemVnum): if 72727 <= itemVnum and 72730 >= itemVnum: return 1 - elif itemVnum >= 76004 and itemVnum <= 76005: ## 새로 들어간 선물용 수룡의 축복 + elif itemVnum >= 76004 and itemVnum <= 76005: ## Gift item: Water Dragon's Blessing return 1 elif itemVnum == 79013: return 1 diff --git a/assets/root/dragon_soul_refine_settings.py b/assets/root/dragon_soul_refine_settings.py index 9ee76a79..e589c38f 100644 --- a/assets/root/dragon_soul_refine_settings.py +++ b/assets/root/dragon_soul_refine_settings.py @@ -12,7 +12,7 @@ strength_fee = { item.MATERIAL_DS_REFINE_HOLLY : 30000, } -# ȭ ܰ +# Maximum strength value for each grade and step of refinement # table(GRADE, STEP) = max strength. default_strength_max_table = [ [2, 2, 3, 3, 4], @@ -22,12 +22,12 @@ default_strength_max_table = [ [4, 4, 4, 5, 6], ] -# ϴ ȹδ strength ȭ , ȭ fee õDZ , -# dragon_soul_refine_info ʾҴ. -# (ȭ ־ ʿ ֵ ϱ ) -# ٸ ȥ Ÿ ȭ fee ֵ س , -# ȥ ȭ fee ٸ ϰ ʹٸ, -# Ŭ ڵ带 ؾ ̴. +# For the current plan, strength enhancement is excluded, and enhancement fee is not determined yet, +# so it is not added to dragon_soul_refine_info. +# (Even if enhancement data exists, we want to be able to exclude it if needed) +# If you want to set different enhancement fees for different dragon soul types in other servers, +# and if you want different enhancement fees for each dragon soul type, +# you need to modify the client code. default_refine_info = { "grade_need_count" : default_grade_need_count, "grade_fee" : default_grade_fee, diff --git a/assets/root/game.py b/assets/root/game.py index 8bebd17c..afefe423 100644 --- a/assets/root/game.py +++ b/assets/root/game.py @@ -105,7 +105,7 @@ class GameWindow(ui.ScriptWindow): self.playerGauge = uiPlayerGauge.PlayerGauge(self) self.playerGauge.Hide() - #wj 2014.1.2. ESC키를 누를 시 우선적으로 DropQuestionDialog를 끄도록 만들었다. 하지만 처음에 itemDropQuestionDialog가 선언되어 있지 않아 ERROR가 발생하여 init에서 선언과 동시에 초기화 시킴. + #wj 2014.1.2. ESC key prioritizes closing DropQuestionDialog. However, itemDropQuestionDialog not initially declared, causing ERROR, so declared and initialized in init. self.itemDropQuestionDialog = None self.__SetQuickSlotMode() @@ -214,7 +214,7 @@ class GameWindow(ui.ScriptWindow): exception.Abort("GameWindow.Open") # END_OF_START_GAME_ERROR_EXIT - # NPC가 큐브시스템으로 만들 수 있는 아이템들의 목록을 캐싱 + # Cache list of items that NPC can craft via cube system # ex) cubeInformation[20383] = [ {"rewordVNUM": 72723, "rewordCount": 1, "materialInfo": "101,1&102,2", "price": 999 }, ... ] self.cubeInformation = {} self.currentCubeNPC = 0 @@ -302,10 +302,10 @@ class GameWindow(ui.ScriptWindow): def __BuildKeyDict(self): onPressKeyDict = {} - ##PressKey 는 누르고 있는 동안 계속 적용되는 키이다. + ##PressKey continuously applies while key is held. - ## 숫자 단축키 퀵슬롯에 이용된다.(이후 숫자들도 퀵 슬롯용 예약) - ## F12 는 클라 디버그용 키이므로 쓰지 않는 게 좋다. + ## Used for number shortcut quickslots (subsequent numbers also reserved for quickslots) + ## F12 is client debug key, should not be used here. onPressKeyDict[app.DIK_1] = lambda : self.__PressNumKey(1) onPressKeyDict[app.DIK_2] = lambda : self.__PressNumKey(2) onPressKeyDict[app.DIK_3] = lambda : self.__PressNumKey(3) @@ -325,7 +325,7 @@ class GameWindow(ui.ScriptWindow): onPressKeyDict[app.DIK_SYSRQ] = lambda : self.SaveScreen() onPressKeyDict[app.DIK_SPACE] = lambda : self.StartAttack() - #캐릭터 이동키 + #Character movement keys onPressKeyDict[app.DIK_UP] = lambda : self.MoveUp() onPressKeyDict[app.DIK_DOWN] = lambda : self.MoveDown() onPressKeyDict[app.DIK_LEFT] = lambda : self.MoveLeft() @@ -572,12 +572,12 @@ class GameWindow(ui.ScriptWindow): self.TextureNum.SetFontName(localeInfo.UI_DEF_FONT) self.TextureNum.SetPosition(wndMgr.GetScreenWidth() - 270, 100) - # 오브젝트 그리는 개수 + # Number of rendered objects self.ObjectNum = ui.TextLine() self.ObjectNum.SetFontName(localeInfo.UI_DEF_FONT) self.ObjectNum.SetPosition(wndMgr.GetScreenWidth() - 270, 120) - # 시야거리 + # View distance self.ViewDistance = ui.TextLine() self.ViewDistance.SetFontName(localeInfo.UI_DEF_FONT) self.ViewDistance.SetPosition(0, 0) @@ -1331,7 +1331,7 @@ class GameWindow(ui.ScriptWindow): self.__DropMoney(attachedType, attachedMoney) def __DropMoney(self, attachedType, attachedMoney): - # PRIVATESHOP_DISABLE_ITEM_DROP - 개인상점 열고 있는 동안 아이템 버림 방지 + # PRIVATESHOP_DISABLE_ITEM_DROP - Prevent item dropping while private shop is open if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return @@ -1353,7 +1353,7 @@ class GameWindow(ui.ScriptWindow): self.itemDropQuestionDialog = itemDropQuestionDialog def __DropItem(self, attachedType, attachedItemIndex, attachedItemSlotPos, attachedItemCount): - # PRIVATESHOP_DISABLE_ITEM_DROP - 개인상점 열고 있는 동안 아이템 버림 방지 + # PRIVATESHOP_DISABLE_ITEM_DROP - Prevent item dropping while private shop is open if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.DROP_ITEM_FAILURE_PRIVATE_SHOP) return @@ -1485,7 +1485,7 @@ class GameWindow(ui.ScriptWindow): def UpdateDebugInfo(self): # - # 캐릭터 좌표 및 FPS 출력 + # Output character coordinates and FPS (x, y, z) = player.GetMainCharacterPosition() nUpdateTime = app.GetUpdateTime() nUpdateFPS = app.GetUpdateFPS() @@ -1648,22 +1648,22 @@ class GameWindow(ui.ScriptWindow): def BINARY_Cube_Close(self): self.interface.CloseCubeWindow() - # 제작에 필요한 골드, 예상되는 완성품의 VNUM과 개수 정보 update + # Update required gold, expected product VNUM and count information def BINARY_Cube_UpdateInfo(self, gold, itemVnum, count): self.interface.UpdateCubeInfo(gold, itemVnum, count) def BINARY_Cube_Succeed(self, itemVnum, count): - print "큐브 제작 성공" + print "Cube crafting successful" self.interface.SucceedCubeWork(itemVnum, count) pass def BINARY_Cube_Failed(self): - print "큐브 제작 실패" + print "Cube crafting failed" self.interface.FailedCubeWork() pass def BINARY_Cube_ResultList(self, npcVNUM, listText): - # ResultList Text Format : 72723,1/72725,1/72730.1/50001,5 이런식으로 "/" 문자로 구분된 리스트를 줌 + # ResultList Text Format: 72723,1/72725,1/72730.1/50001,5 - list separated by "/" character #print listText if npcVNUM == 0: @@ -1764,7 +1764,7 @@ class GameWindow(ui.ScriptWindow): # END_OF_CUBE - # 용혼석 + # Dragon Soul Stone def BINARY_Highlight_Item(self, inven_type, inven_pos): self.interface.Highligt_Item(inven_type, inven_pos) diff --git a/assets/root/interfacemodule.py b/assets/root/interfacemodule.py index ac641e41..91ce0599 100644 --- a/assets/root/interfacemodule.py +++ b/assets/root/interfacemodule.py @@ -572,7 +572,7 @@ class Interface(object): if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.RefreshItemSlot() - def RefreshCharacter(self): ## Character 페이지의 얼굴, Inventory 페이지의 전신 그림 등의 Refresh + def RefreshCharacter(self): ## Refresh character face in Character page, full body in Inventory page, etc. self.wndCharacter.RefreshCharacter() self.wndTaskBar.RefreshQuickSlot() @@ -704,7 +704,7 @@ class Interface(object): def RemovePartyMember(self, pid): self.wndParty.RemovePartyMember(pid) - ##!! 20061026.levites.퀘스트_위치_보정 + ## Quest position adjustment self.__ArrangeQuestButton() def LinkPartyMember(self, pid, vid): @@ -719,7 +719,7 @@ class Interface(object): def ExitParty(self): self.wndParty.ExitParty() - ##!! 20061026.levites.퀘스트_위치_보정 + ## Quest position adjustment self.__ArrangeQuestButton() def PartyHealReady(self): @@ -882,7 +882,7 @@ class Interface(object): if True == self.wndChat.IsEditMode(): self.wndChat.CloseChat() else: - # 웹페이지가 열렸을때는 채팅 입력이 안됨 + # Chat input disabled when webpage is open if self.wndWeb and self.wndWeb.IsShow(): pass else: @@ -983,7 +983,7 @@ class Interface(object): else: self.wndExpandedTaskBar.Close() - # 용혼석 + # Dragon soul def DragonSoulActivate(self, deck): if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.ActivateDragonSoulByExtern(deck) @@ -991,12 +991,12 @@ class Interface(object): def DragonSoulDeactivate(self): if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.DeactivateDragonSoul() - + def Highligt_Item(self, inven_type, inven_pos): if player.DRAGON_SOUL_INVENTORY == inven_type: if app.ENABLE_DRAGON_SOUL_SYSTEM: self.wndDragonSoul.HighlightSlot(inven_pos) - + def DragonSoulGiveQuilification(self): self.DRAGON_SOUL_IS_QUALIFIED = True self.wndExpandedTaskBar.SetToolTipText(uiTaskBar.ExpandedTaskBar.BUTTON_DRAGON_SOUL, uiScriptLocale.TASKBAR_DRAGON_SOUL) @@ -1054,7 +1054,7 @@ class Interface(object): if True == self.wndDragonSoulRefine.IsShow(): self.wndDragonSoulRefine.Close() - # 용혼석 끝 + # Dragon soul end def ToggleGuildWindow(self): if not self.wndGuild.IsShow(): @@ -1104,7 +1104,7 @@ class Interface(object): def OpenWebWindow(self, url): self.wndWeb.Open(url) - # 웹페이지를 열면 채팅을 닫는다 + # Close chat when opening webpage self.wndChat.CloseChat() # show GIFT @@ -1131,10 +1131,10 @@ class Interface(object): def SucceedCubeWork(self, itemVnum, count): self.wndCube.Clear() - - print "큐브 제작 성공! [%d:%d]" % (itemVnum, count) - if 0: # 결과 메시지 출력은 생략 한다 + print "Cube crafting successful! [%d:%d]" % (itemVnum, count) + + if 0: # Skip showing result message self.wndCubeResult.SetPosition(*self.wndCube.GetGlobalPosition()) self.wndCubeResult.SetCubeResultItem(itemVnum, count) self.wndCubeResult.Open() @@ -1297,7 +1297,7 @@ class Interface(object): btn = uiWhisper.WhisperButton() # QUEST_LETTER_IMAGE - ##!! 20061026.levites.퀘스트_이미지_교체 + ## Quest image replacement import item if "item"==iconType: item.SelectItem(int(iconName)) @@ -1334,7 +1334,7 @@ class Interface(object): screenWidth = wndMgr.GetScreenWidth() screenHeight = wndMgr.GetScreenHeight() - ##!! 20061026.levites.퀘스트_위치_보정 + ## Quest position adjustment if self.wndParty.IsShow(): xPos = 100 + 30 else: @@ -1388,8 +1388,8 @@ class Interface(object): def __InitWhisper(self): chat.InitWhisper(self) - ## 채팅창의 "메시지 보내기"를 눌렀을때 이름 없는 대화창을 여는 함수 - ## 이름이 없기 때문에 기존의 WhisperDialogDict 와 별도로 관리된다. + ## Opens unnamed whisper dialog when "Send Message" is clicked in chat window + ## Managed separately from WhisperDialogDict because it has no name def OpenWhisperDialogWithoutTarget(self): if not self.dlgWhisperWithoutTarget: dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) @@ -1406,7 +1406,7 @@ class Interface(object): self.dlgWhisperWithoutTarget.SetTop() self.dlgWhisperWithoutTarget.OpenWithoutTarget(self.RegisterTemporaryWhisperDialog) - ## 이름 없는 대화창에서 이름을 결정했을때 WhisperDialogDict에 창을 넣어주는 함수 + ## Adds window to WhisperDialogDict when name is determined in unnamed dialog def RegisterTemporaryWhisperDialog(self, name): if not self.dlgWhisperWithoutTarget: return @@ -1425,7 +1425,7 @@ class Interface(object): self.dlgWhisperWithoutTarget = None self.__CheckGameMaster(name) - ## 캐릭터 메뉴의 1:1 대화 하기를 눌렀을때 이름을 가지고 바로 창을 여는 함수 + ## Opens whisper window directly with name when "1:1 Chat" is clicked in character menu def OpenWhisperDialog(self, name): if not self.whisperDialogDict.has_key(name): dlg = self.__MakeWhisperDialog(name) @@ -1438,7 +1438,7 @@ class Interface(object): if 0 != btn: self.__DestroyWhisperButton(btn) - ## 다른 캐릭터로부터 메세지를 받았을때 일단 버튼만 띄워 두는 함수 + ## Shows button when receiving message from another character def RecvWhisper(self, name): if not self.whisperDialogDict.has_key(name): btn = self.__FindWhisperButton(name) @@ -1457,7 +1457,7 @@ class Interface(object): def MakeWhisperButton(self, name): self.__MakeWhisperButton(name) - ## 버튼을 눌렀을때 창을 여는 함수 + ## Opens window when button is clicked def ShowWhisperDialog(self, btn): try: self.__MakeWhisperDialog(btn.name) @@ -1469,11 +1469,11 @@ class Interface(object): import dbg dbg.TraceError("interface.ShowWhisperDialog - Failed to find key") - ## 버튼 초기화 + ## Reset button self.__DestroyWhisperButton(btn) - ## WhisperDialog 창에서 최소화 명령을 수행했을때 호출되는 함수 - ## 창을 최소화 합니다. + ## Called when minimize command is executed in WhisperDialog window + ## Minimizes the window def MinimizeWhisperDialog(self, name): if 0 != name: @@ -1481,8 +1481,8 @@ class Interface(object): self.CloseWhisperDialog(name) - ## WhisperDialog 창에서 닫기 명령을 수행했을때 호출되는 함수 - ## 창을 지웁니다. + ## Called when close command is executed in WhisperDialog window + ## Destroys the window def CloseWhisperDialog(self, name): if 0 == name: @@ -1501,7 +1501,7 @@ class Interface(object): import dbg dbg.TraceError("interface.CloseWhisperDialog - Failed to find key") - ## 버튼의 개수가 바뀌었을때 버튼을 재정렬 하는 함수 + ## Rearranges buttons when button count changes def __ArrangeWhisperButton(self): screenWidth = wndMgr.GetScreenWidth() @@ -1518,9 +1518,9 @@ class Interface(object): button.SetPosition(xPos + (int(count/yCount) * -50), yPos + (count%yCount * 63)) count += 1 - ## 이름으로 Whisper 버튼을 찾아 리턴해 주는 함수 - ## 버튼은 딕셔너리로 하지 않는 것은 정렬 되어 버려 순서가 유지 되지 않으며 - ## 이로 인해 ToolTip들이 다른 버튼들에 의해 가려지기 때문이다. + ## Finds and returns Whisper button by name + ## Buttons are not stored in dictionary because sorting would lose order + ## This prevents tooltips from being covered by other buttons def __FindWhisperButton(self, name): for button in self.whisperButtonList: if button.name == name: @@ -1528,7 +1528,7 @@ class Interface(object): return 0 - ## 창을 만듭니다. + ## Creates window def __MakeWhisperDialog(self, name): dlgWhisper = uiWhisper.WhisperDialog(self.MinimizeWhisperDialog, self.CloseWhisperDialog) dlgWhisper.BindInterface(self) @@ -1540,7 +1540,7 @@ class Interface(object): return dlgWhisper - ## 버튼을 만듭니다. + ## Creates button def __MakeWhisperButton(self, name): whisperButton = uiWhisper.WhisperButton() whisperButton.SetUpVisual("d:/ymir work/ui/game/windows/btn_mail_up.sub") diff --git a/assets/root/intrologin.py b/assets/root/intrologin.py index cede6527..d407cc4a 100644 --- a/assets/root/intrologin.py +++ b/assets/root/intrologin.py @@ -245,13 +245,13 @@ class LoginWindow(ui.ScriptWindow): print "---------------------------------------------------------------------------- CLOSE LOGIN WINDOW " # - # selectMusic BGM Ƿ ΰ üũѴ. + # Check both since BGM stops if selectMusic is not set. # if musicInfo.loginMusic != "" and musicInfo.selectMusic != "": snd.FadeOutMusic("BGM/"+musicInfo.loginMusic) - ## NOTE : idEditLine pwdEditLine ̺Ʈ Ǿ־ - ## Event ʱȭ ־߸ մϴ - [levites] + ## NOTE : idEditLine and pwdEditLine have interconnected events + ## Events must be forcibly initialized - [levites] self.idEditLine.SetTabEvent(0) self.idEditLine.SetReturnEvent(0) self.pwdEditLine.SetReturnEvent(0) @@ -382,7 +382,7 @@ class LoginWindow(ui.ScriptWindow): loginFailureMsg = localeInfo.LOGIN_FAILURE_UNKNOWN + error - #0000685: [M2EU] ̵/йȣ : н Ŀ + #0000685: [M2EU] ID/password guessing bug fix: always set focus to password field loginFailureFunc=self.loginFailureFuncDict.get(error, self.SetPasswordEditLineFocus) if app.loggined: @@ -579,18 +579,18 @@ class LoginWindow(ui.ScriptWindow): execfile(loginInfoFileName, loginInfo) except IOError: print(\ - "ڵ α Ͻ÷" + loginInfoFileName + " ۼּ\n"\ + "For automatic login, please create" + loginInfoFileName + "file\n"\ "\n"\ - ":\n"\ + "Contents:\n"\ "================================================================\n"\ - "addr=ּ\n"\ - "port=Ʈ\n"\ - "id=̵\n"\ - "pwd=йȣ\n"\ - "slot=ij ε (ų -1̸ ڵ )\n"\ - "autoLogin=ڵ \n" - "autoSelect=ڵ \n" - "locale=(ymir) LC_Ymir ϰ ymir ۵. korea ۵\n" + "addr=address\n"\ + "port=port number\n"\ + "id=user ID\n"\ + "pwd=password\n"\ + "slot=character selection index (if absent or -1, no auto-selection)\n"\ + "autoLogin=enable auto login\n" + "autoSelect=enable auto select\n" + "locale=(ymir) works as ymir for LC_Ymir. Works as korea if not specified\n" ); id=loginInfo.get("id", "") @@ -634,7 +634,7 @@ class LoginWindow(ui.ScriptWindow): self.Connect(id, pwd) print "==================================================================================" - print "ڵ α: %s - %s:%d %s" % (loginInfoFileName, addr, port, id) + print "Auto login: %s - %s:%d %s" % (loginInfoFileName, addr, port, id) print "==================================================================================" @@ -718,7 +718,7 @@ class LoginWindow(ui.ScriptWindow): if channelIndex >= 0: self.channelList.SelectItem(channelIndex) - ## Show/Hide ڵ忡 ־ ӽ - [levites] + ## Temporary fix for Show/Hide code issue - [levites] self.serverBoard.SetPosition(self.xServerBoard, self.yServerBoard) self.serverBoard.Show() self.connectBoard.Hide() @@ -930,7 +930,7 @@ class LoginWindow(ui.ScriptWindow): self.PopupNotifyMessage(localeInfo.CHANNEL_SELECT_CHANNEL) return - # ° FULL + # Entry is prohibited if status equals FULL if state == serverInfo.STATE_DICT[3]: self.PopupNotifyMessage(localeInfo.CHANNEL_NOTIFY_FULL) return @@ -953,7 +953,7 @@ class LoginWindow(ui.ScriptWindow): tcp_port = serverInfo.REGION_DICT[regionID][serverID]["channel"][channelID]["tcp_port"] except: import exception - exception.Abort("LoginWindow.__OnClickSelectServerButton - ") + exception.Abort("LoginWindow.__OnClickSelectServerButton - server selection failed") try: account_ip = serverInfo.REGION_AUTH_SERVER_DICT[regionID][serverID]["ip"] @@ -973,7 +973,7 @@ class LoginWindow(ui.ScriptWindow): except: import exception - exception.Abort("LoginWindow.__OnClickSelectServerButton - ũ ") + exception.Abort("LoginWindow.__OnClickSelectServerButton - mark information missing") self.stream.SetConnectInfo(ip, tcp_port, account_ip, account_port) self.__OpenLoginBoard() diff --git a/assets/root/intrologo.py b/assets/root/intrologo.py index 01e0186f..31034abf 100644 --- a/assets/root/intrologo.py +++ b/assets/root/intrologo.py @@ -6,13 +6,13 @@ import wndMgr import uiScriptLocale import localeInfo -# κ PythonApplicationLogo.cpp ִ. +# Most related code is in PythonApplicationLogo.cpp app.SetGuildMarkPath("test") class LogoWindow(ui.ScriptWindow): - # (迭 ) + # List of videos to display (shown in array order) videoList = [] def __init__(self, stream): @@ -48,7 +48,7 @@ class LogoWindow(ui.ScriptWindow): app.HideCursor() - # Ұ ȯ̰ų, ʴ introLogin skip. + # Skip to introLogin if video playback is impossible or videos are not provided. def OnUpdate(self): if self.bNeedUpdate: if self.playingVideo == 0: diff --git a/assets/root/mousemodule.py b/assets/root/mousemodule.py index 92927652..1413f4b8 100644 --- a/assets/root/mousemodule.py +++ b/assets/root/mousemodule.py @@ -15,8 +15,8 @@ import systemSetting import localeInfo -## Mouse Controler -## 콺 Ŀ ϸ 콺 Ŀ AttachǾ ̴ Object ִ. +## Mouse Controller +## When operating the mouse cursor, you can exchange information with the attached Object. class CursorImage(object): def __init__(self): @@ -157,7 +157,7 @@ class CMouseController(object): self.curCursorImage = self.cursorDict[app.NORMAL] except KeyError: - dbg.TraceError("mouseModule.MouseController.SetCursor - ߸ Ŀ ȣ [%d]" % cursorNum) + dbg.TraceError("mouseModule.MouseController.SetCursor - Invalid cursor number [%d]" % cursorNum) self.curCursorName = app.NORMAL self.curCursorImage = self.cursorDict[app.NORMAL] diff --git a/assets/root/networkmodule.py b/assets/root/networkmodule.py index ef1eb79f..40108c58 100644 --- a/assets/root/networkmodule.py +++ b/assets/root/networkmodule.py @@ -125,16 +125,16 @@ class MainStream(object): def SetPhaseWindow(self, newPhaseWindow): if self.newPhaseWindow: - #print "̹ ο ٲۻ¿ ٲ", newPhaseWindow + #print "Already in the process of changing to a new phase, skip", newPhaseWindow self.__ChangePhaseWindow() self.newPhaseWindow=newPhaseWindow if self.curPhaseWindow: - #print "̵ ƿǸ ٲ" + #print "Change after fade out" self.curtain.FadeOut(self.__ChangePhaseWindow) else: - #print " 찡 ¶ ٷ ٲ" + #print "Change immediately if there's no current phase" self.__ChangePhaseWindow() def __ChangePhaseWindow(self): diff --git a/assets/root/playersettingmodule.py b/assets/root/playersettingmodule.py index a7b678ab..e78fde0c 100644 --- a/assets/root/playersettingmodule.py +++ b/assets/root/playersettingmodule.py @@ -109,7 +109,7 @@ def RegisterSkill(race, group, empire=0): for i in xrange(len(activeSkillList)): skillIndex = activeSkillList[i] - ## 7번 8번 스킬은 여기서 설정하면 안됨 + ## Skills 7 and 8 should not be set here if i != 6 and i != 7: player.SetSkill(i+1, skillIndex) @@ -199,20 +199,20 @@ def __InitData(): chrmgr.RegisterCacheEffect(chrmgr.EFFECT_SPEEDUP_GREEN, "", "d:/ymir work/effect/etc/recuperation/drugup_green.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_DXUP_PURPLE, "", "d:/ymir work/effect/etc/recuperation/drugup_purple.mse") - #자동물약 HP, SP + # Auto potions HP, SP chrmgr.RegisterCacheEffect(chrmgr.EFFECT_AUTO_HPUP, "", "d:/ymir work/effect/etc/recuperation/autodrugup_red.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_AUTO_SPUP, "", "d:/ymir work/effect/etc/recuperation/autodrugup_blue.mse") - - #라마단 초승달의 반지(71135) 착용순간 발동 이펙트 + + # Ramadan Crescent Ring (71135) equip effect chrmgr.RegisterCacheEffect(chrmgr.EFFECT_RAMADAN_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item1.mse") - - #할로윈 사탕 착용순간 발동 이펙트 + + # Halloween candy equip effect chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HALLOWEEN_CANDY_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item2.mse") - - #행복의 반지 착용순간 발동 이펙트 + + # Happiness Ring equip effect chrmgr.RegisterCacheEffect(chrmgr.EFFECT_HAPPINESS_RING_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item3.mse") - #사랑의 팬던트 착용순간 발동 이펙트 + # Love Pendant equip effect chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LOVE_PENDANT_EQUIP, "", "d:/ymir work/effect/etc/buff/buff_item4.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PENETRATE, "Bip01", "d:/ymir work/effect/hit/gwantong.mse") @@ -239,8 +239,8 @@ def __InitData(): #chrmgr.RegisterCacheEffect(chrmgr.EFFECT_SUCCESS, "", "season1/effect/success.mse") #chrmgr.RegisterCacheEffect(chrmgr.EFFECT_FAIL, "", "season1/effect/fail.mse") - chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_ON_14_FOR_GERMANY, "","season1/effect/paymessage_warning.mse") #레벨업 14일때 ( 독일전용 ) - chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_UNDER_15_FOR_GERMANY, "", "season1/effect/paymessage_decide.mse" )#레벨업 15일때 ( 독일전용 ) + chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_ON_14_FOR_GERMANY, "","season1/effect/paymessage_warning.mse") # Level up at 14 (Germany only) + chrmgr.RegisterCacheEffect(chrmgr.EFFECT_LEVELUP_UNDER_15_FOR_GERMANY, "", "season1/effect/paymessage_decide.mse" )# Level up at 15 (Germany only) chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PERCENT_DAMAGE1, "", "d:/ymir work/effect/hit/percent_damage1.mse") chrmgr.RegisterCacheEffect(chrmgr.EFFECT_PERCENT_DAMAGE2, "", "d:/ymir work/effect/hit/percent_damage2.mse") @@ -344,28 +344,28 @@ def __LoadGameEffect(): chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+0, "Bip01", localeInfo.FN_GM_MARK) # END_OF_LOCALE - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+3, "Bip01", "d:/ymir work/effect/hit/blow_poison/poison_loop.mse") ## 중독 + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+3, "Bip01", "d:/ymir work/effect/hit/blow_poison/poison_loop.mse") ## Poison chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+4, "", "d:/ymir work/effect/affect/slow.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+5, "Bip01 Head", "d:/ymir work/effect/etc/stun/stun_loop.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+6, "", "d:/ymir work/effect/etc/ready/ready.mse") #chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+8, "", "d:/ymir work/guild/effect/10_construction.mse") #chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+9, "", "d:/ymir work/guild/effect/20_construction.mse") #chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+10, "", "d:/ymir work/guild/effect/20_upgrade.mse") - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+16, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## 천근추 (밑에도 있따-_-) - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+17, "", "d:/ymir work/pc/assassin/effect/gyeonggong_loop.mse") ## 자객 - 경공 + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+16, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## Heavy Anchor (duplicated below) + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+17, "", "d:/ymir work/pc/assassin/effect/gyeonggong_loop.mse") ## Assassin - Lightness chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+19, "Bip01 R Finger2", "d:/ymir work/pc/sura/effect/gwigeom_loop.mse") - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+20, "", "d:/ymir work/pc/sura/effect/fear_loop.mse") ## 수라 - 공포 - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+21, "", "d:/ymir work/pc/sura/effect/jumagap_loop.mse") ## 수라 - 주마갑 - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+22, "", "d:/ymir work/pc/shaman/effect/3hosin_loop.mse") ## 무당 - 호신 - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+23, "", "d:/ymir work/pc/shaman/effect/boho_loop.mse") ## 무당 - 보호 - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+24, "", "d:/ymir work/pc/shaman/effect/10kwaesok_loop.mse") ## 무당 - 쾌속 + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+20, "", "d:/ymir work/pc/sura/effect/fear_loop.mse") ## Sura - Fear + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+21, "", "d:/ymir work/pc/sura/effect/jumagap_loop.mse") ## Sura - Armor Protection + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+22, "", "d:/ymir work/pc/shaman/effect/3hosin_loop.mse") ## Shaman - Protection + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+23, "", "d:/ymir work/pc/shaman/effect/boho_loop.mse") ## Shaman - Shield + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+24, "", "d:/ymir work/pc/shaman/effect/10kwaesok_loop.mse") ## Shaman - Swiftness chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+25, "", "d:/ymir work/pc/sura/effect/heuksin_loop.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+26, "", "d:/ymir work/pc/sura/effect/muyeong_loop.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+28, "Bip01", "d:/ymir work/effect/hit/blow_flame/flame_loop.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+29, "Bip01 R Hand", "d:/ymir work/pc/shaman/effect/6gicheon_hand.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+30, "Bip01 L Hand", "d:/ymir work/pc/shaman/effect/jeungryeok_hand.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+32, "Bip01 Head", "d:/ymir work/pc/sura/effect/pabeop_loop.mse") - chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+33, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## 천근추 (Fallen) + chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+33, "", "d:/ymir work/pc/warrior/effect/gyeokgongjang_loop.mse") ## Heavy Anchor (Fallen) ## 34 Polymoph chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+35, "", "d:/ymir work/effect/etc/guild_war_flag/flag_red.mse") chrmgr.RegisterEffect(chrmgr.EFFECT_AFFECT+36, "", "d:/ymir work/effect/etc/guild_war_flag/flag_blue.mse") @@ -399,53 +399,53 @@ def __LoadGameEffect(): chrmgr.RegisterEffect(chrmgr.EFFECT_REFINED+20, "Bip01", "D:/ymir work/pc/common/effect/armor/armor-4-2-2.mse") ## FlyData - effect.RegisterIndexedFlyData(effect.FLY_EXP, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_yellow_small2.msf") ## 노란색 (EXP) - effect.RegisterIndexedFlyData(effect.FLY_HP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_small.msf") ## 빨간색 (HP) 작은거 - effect.RegisterIndexedFlyData(effect.FLY_HP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_big.msf") ## 빨간색 (HP) 큰거 - effect.RegisterIndexedFlyData(effect.FLY_SP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_warrior_small.msf") ## 파란색 꼬리만 있는거 - effect.RegisterIndexedFlyData(effect.FLY_SP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_small.msf") ## 파란색 작은거 - effect.RegisterIndexedFlyData(effect.FLY_SP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_big.msf") ## 파란색 큰거 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK1, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_1.msf") ## 폭죽 1 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK2, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_2.msf") ## 폭죽 2 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK3, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_3.msf") ## 폭죽 3 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK4, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_4.msf") ## 폭죽 4 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK5, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_5.msf") ## 폭죽 5 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK6, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_6.msf") ## 폭죽 6 - effect.RegisterIndexedFlyData(effect.FLY_FIREWORK_XMAS, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_xmas.msf") ## 폭죽 X-Mas - effect.RegisterIndexedFlyData(effect.FLY_CHAIN_LIGHTNING, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/pc/shaman/effect/pokroe.msf") ## 폭뢰격 - effect.RegisterIndexedFlyData(effect.FLY_HP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_smallest.msf") ## 빨간색 매우 작은거 - effect.RegisterIndexedFlyData(effect.FLY_SKILL_MUYEONG, effect.INDEX_FLY_TYPE_AUTO_FIRE, "d:/ymir work/pc/sura/effect/muyeong_fly.msf") ## 무영진 + effect.RegisterIndexedFlyData(effect.FLY_EXP, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_yellow_small2.msf") ## Yellow (EXP) + effect.RegisterIndexedFlyData(effect.FLY_HP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_small.msf") ## Red (HP) small + effect.RegisterIndexedFlyData(effect.FLY_HP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_big.msf") ## Red (HP) large + effect.RegisterIndexedFlyData(effect.FLY_SP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_warrior_small.msf") ## Blue tail only + effect.RegisterIndexedFlyData(effect.FLY_SP_MEDIUM, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_small.msf") ## Blue small + effect.RegisterIndexedFlyData(effect.FLY_SP_BIG, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_blue_big.msf") ## Blue large + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK1, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_1.msf") ## Firework 1 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK2, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_2.msf") ## Firework 2 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK3, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_3.msf") ## Firework 3 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK4, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_4.msf") ## Firework 4 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK5, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_5.msf") ## Firework 5 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK6, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_6.msf") ## Firework 6 + effect.RegisterIndexedFlyData(effect.FLY_FIREWORK_XMAS, effect.INDEX_FLY_TYPE_FIRE_CRACKER, "d:/ymir work/effect/etc/firecracker/firecracker_xmas.msf") ## Firework X-Mas + effect.RegisterIndexedFlyData(effect.FLY_CHAIN_LIGHTNING, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/pc/shaman/effect/pokroe.msf") ## Chain Lightning + effect.RegisterIndexedFlyData(effect.FLY_HP_SMALL, effect.INDEX_FLY_TYPE_NORMAL, "d:/ymir work/effect/etc/gathering/ga_piece_red_smallest.msf") ## Red very small + effect.RegisterIndexedFlyData(effect.FLY_SKILL_MUYEONG, effect.INDEX_FLY_TYPE_AUTO_FIRE, "d:/ymir work/pc/sura/effect/muyeong_fly.msf") ## Shadowless ######################################################################################### ## Emoticon EmoticonStr = "d:/ymir work/effect/etc/emoticon/" chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+0, "", EmoticonStr+"sweat.mse") - net.RegisterEmoticonString("(황당)") + net.RegisterEmoticonString("(sweat)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+1, "", EmoticonStr+"money.mse") - net.RegisterEmoticonString("(돈)") + net.RegisterEmoticonString("(money)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+2, "", EmoticonStr+"happy.mse") - net.RegisterEmoticonString("(기쁨)") + net.RegisterEmoticonString("(happy)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+3, "", EmoticonStr+"love_s.mse") - net.RegisterEmoticonString("(좋아)") + net.RegisterEmoticonString("(like)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+4, "", EmoticonStr+"love_l.mse") - net.RegisterEmoticonString("(사랑)") + net.RegisterEmoticonString("(love)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+5, "", EmoticonStr+"angry.mse") - net.RegisterEmoticonString("(분노)") + net.RegisterEmoticonString("(angry)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+6, "", EmoticonStr+"aha.mse") - net.RegisterEmoticonString("(아하)") + net.RegisterEmoticonString("(aha)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+7, "", EmoticonStr+"gloom.mse") - net.RegisterEmoticonString("(우울)") + net.RegisterEmoticonString("(sad)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+8, "", EmoticonStr+"sorry.mse") - net.RegisterEmoticonString("(죄송)") + net.RegisterEmoticonString("(sorry)") chrmgr.RegisterEffect(chrmgr.EFFECT_EMOTICON+9, "", EmoticonStr+"!_mix_back.mse") net.RegisterEmoticonString("(!)") @@ -1111,7 +1111,7 @@ def __LoadGameShamanEx(race, path): #chrmgr.RegisterCacheMotionData(chr.MOTION_MODE_GENERAL, chr.MOTION_SKILL+10, "budong.msa") START_INDEX = 0 - #skill.SKILL_EFFECT_COUNT 까지// + # Up to skill.SKILL_EFFECT_COUNT for i in (1, 2, 3): END_STRING = "" if i != 0: END_STRING = "_%d" % (i+1) @@ -1318,7 +1318,7 @@ def LoadGuildBuildingList(filename): elif itemID == uiGuild.MATERIAL_PLYWOOD_ID: materialList[uiGuild.MATERIAL_PLYWOOD_INDEX] = count - ## GuildSymbol 은 일반 NPC 들과 함께 등록한다. + ## GuildSymbol is registered together with regular NPCs import chrmgr chrmgr.RegisterRaceSrcName(name, folderName) chrmgr.RegisterRaceName(vnum, name) diff --git a/assets/root/uiauction.py b/assets/root/uiauction.py index 8e281d33..27fff4cf 100644 --- a/assets/root/uiauction.py +++ b/assets/root/uiauction.py @@ -20,9 +20,9 @@ class AuctionWindow(ui.ScriptWindow): pyScrLoader.LoadScriptFile(self, "uiscript/auctionwindow.py") self.pageName = { - "LIST" : "Ÿ Ʈ", - "REGISTER" : "Ÿ ", - "UNIQUE_AUCTION" : "ũ ", + "LIST" : "Trade List", + "REGISTER" : "Register Trade", + "UNIQUE_AUCTION" : "Unique Auction", } self.pageWindow = { "LIST" : self.PageWindow(self, "uiscript/auctionwindow_listpage.py"), @@ -84,7 +84,7 @@ class AuctionWindow(ui.ScriptWindow): deleteButton.SetUpVisual("d:/ymir work/ui/public/small_button_01.sub") deleteButton.SetOverVisual("d:/ymir work/ui/public/small_button_02.sub") deleteButton.SetDownVisual("d:/ymir work/ui/public/small_button_03.sub") - deleteButton.SetText("") + deleteButton.SetText("Purchase") deleteButton.Show() page.Children.append(deleteButton) @@ -109,19 +109,19 @@ class AuctionWindow(ui.ScriptWindow): itemName = ui.MakeTextLine(page, False, 117, yPos + 14) page.Children.append(itemName) ## Temporary - itemName.SetText(" ") + itemName.SetText("Fairy Hairpin") ## Temporary curPrice = ui.MakeTextLine(page, False, 117, yPos + 31) page.Children.append(curPrice) ## Temporary - curPrice.SetText("簡 : 20 1234 1234") + curPrice.SetText("Current Price: 2,012,341,234 Yang") ## Temporary lastTime = ui.MakeTextLine(page, False, 117, yPos + 48) page.Children.append(lastTime) ## Temporary - lastTime.SetText(" ð : 19 28") + lastTime.SetText("Time Until Close: 19 min 28 sec") ## Temporary priceSlotImage = ui.MakeImageBox(page, "d:/ymir work/ui/public/Parameter_Slot_05.sub", 117, yPos + 65) @@ -129,7 +129,7 @@ class AuctionWindow(ui.ScriptWindow): page.Children.append(priceSlotImage) page.Children.append(priceSlot) ## Temporary - priceSlot.SetText("20 1234 1234") + priceSlot.SetText("2,012,341,234 Yang") ## Temporary def SelectPage(self, arg): diff --git a/assets/root/uicharacter.py b/assets/root/uicharacter.py index de2912ab..fddd0e0a 100644 --- a/assets/root/uicharacter.py +++ b/assets/root/uicharacter.py @@ -518,7 +518,7 @@ class CharacterWindow(ui.ScriptWindow): except: #import exception #exception.Abort("CharacterWindow.RefreshStatus.BindObject") - ## 게임이 튕겨 버림 + ## Prevents game crash pass self.__RefreshStatusPlusButtonList() @@ -792,7 +792,7 @@ class CharacterWindow(ui.ScriptWindow): skillLevel = getSkillLevel(slotIndex) skillType = getSkillType(skillIndex) - ## 승마 스킬 예외 처리 + ## Horse riding skill exception handling if player.SKILL_INDEX_RIDING == skillIndex: if 1 == skillGrade: skillLevel += 19 @@ -920,11 +920,11 @@ class CharacterWindow(ui.ScriptWindow): def CanShowPlusButton(self, skillIndex, skillLevel, curStatPoint): - ## 스킬이 있으면 + ## Check if skill exists if 0 == skillIndex: return False - ## 레벨업 조건을 만족한다면 + ## Check if skill can be leveled up if not skill.CanLevelUpSkill(skillIndex, skillLevel): return False @@ -1043,8 +1043,8 @@ class CharacterWindow(ui.ScriptWindow): mouseModule.mouseController.DeattachObject() - ## FIXME : 스킬을 사용했을때 슬롯 번호를 가지고 해당 슬롯을 찾아서 업데이트 한다. - ## 매우 불합리. 구조 자체를 개선해야 할듯. + ## FIXME: When using a skill, find and update the slot by slot number. + ## Very inefficient. The structure itself needs improvement. def OnUseSkill(self, slotIndex, coolTime): skillIndex = player.GetSkillIndex(slotIndex) skillType = skill.GetSkillType(skillIndex) diff --git a/assets/root/uicube.py b/assets/root/uicube.py index 0fb8fbd4..a63240d0 100644 --- a/assets/root/uicube.py +++ b/assets/root/uicube.py @@ -234,7 +234,7 @@ class CubeWindow(ui.ScriptWindow): self.tooltipItem.AddItemData(itemVnum, metinSlot, attrSlot) - # Ḧ Ŭϸ κ丮 ش ãƼ . + # Click material to find and register item from inventory. def __OnSelectMaterialSlot(self, trash, resultIndex, materialIndex): resultIndex = resultIndex + self.firstSlotIndex if resultIndex not in self.cubeMaterialInfos: @@ -247,18 +247,18 @@ class CubeWindow(ui.ScriptWindow): return for itemVnum, itemCount in materialInfo[materialIndex]: - bAddedNow = False # ̹ Ŭν ߰Ǿ? + bAddedNow = False # Was item added by this click? item.SelectItem(itemVnum) itemSizeX, itemSizeY = item.GetItemSize() - # ʿ ŭ Ḧ ִ°? + # Do you have enough materials for crafting? if player.GetItemCountByVnum(itemVnum) >= itemCount: for i in xrange(player.INVENTORY_SLOT_COUNT): vnum = player.GetItemIndex(i) count= player.GetItemCount(i) if vnum == itemVnum and count >= itemCount: - # ̹ ϵǾ ִ ˻ϰ, ٸ ߰ + # Check if same item already registered, add if not bAlreadyExists = False for slotPos, invenPos in self.cubeItemInfo.items(): if invenPos == i: @@ -269,17 +269,17 @@ class CubeWindow(ui.ScriptWindow): #print "Cube Status : ", self.cubeItemInfo - # ϸ ť꿡 ϵ ̹Ƿ, ť Կ ش ߰ + # If entered here, item not registered in cube, so add to empty cube slot bCanAddSlot = False for slotPos in xrange(self.cubeSlot.GetSlotCount()): - # ť ִ°? + # Is this cube slot empty? if not slotPos in self.cubeItemInfo: upperColumnItemSizeY = -1 currentSlotLine = int(slotPos / self.CUBE_SLOT_COUNTX) cubeColumn = int(slotPos % self.CUBE_SLOT_COUNTX) - # ť꿡 3ĭ¥ ϵǾ ִٸ, (column) ̻ ͵ Ѿ + # If 3-slot item registered in cube, skip this column entirely if cubeColumn in self.cubeItemInfo: columnVNUM = player.GetItemIndex(self.cubeItemInfo[cubeColumn]) item.SelectItem(columnVNUM) @@ -293,7 +293,7 @@ class CubeWindow(ui.ScriptWindow): item.SelectItem(upperColumnVNUM) columnItemSizeX, upperColumnItemSizeY = item.GetItemSize() - # 1ĭ¥ ٷ ٿ ĭ¥ ־ + # 1-slot items must have 1-slot item directly above if 1 == itemSizeY: if 0 == currentSlotLine: bCanAddSlot = True @@ -301,13 +301,13 @@ class CubeWindow(ui.ScriptWindow): bCanAddSlot = True elif 2 == currentSlotLine: bCanAddSlot = True - # 2ĭ¥ Ʒ ־ + # 2-slot items must have empty spaces above and below elif 2 == itemSizeY: if 0 == currentSlotLine and not cubeColumn + self.CUBE_SLOT_COUNTX in self.cubeItemInfo: bCanAddSlot = True elif 1 == currentSlotLine and 1 == upperColumnItemSizeY and not cubeColumn + (self.CUBE_SLOT_COUNTX * 2) in self.cubeItemInfo: bCanAddSlot = True - # 3ĭ¥ ش Column ü ־ + # 3-slot items require entire column to be empty else: if not cubeColumn in self.cubeItemInfo and not cubeColumn + self.CUBE_SLOT_COUNTX in self.cubeItemInfo and not cubeColumn + (self.CUBE_SLOT_COUNTX * 2) in self.cubeItemInfo: bCanAddSlot = True @@ -476,17 +476,17 @@ class CubeWindow(ui.ScriptWindow): if self.isUsable: self.isUsable = False - print "ť ݱ" + print "Close cube" net.SendChatPacket("/cube close") self.Close() def __OnAcceptButtonClick(self): if len(self.cubeItemInfo) == 0: - " ť" + "Empty cube" return - print "ť " + print "Start cube crafting" #for invenPos in self.cubeItemInfo.values(): # net.SendChatPacket("/cube add " + str(invenPos)) net.SendChatPacket("/cube make") diff --git a/assets/root/uidragonsoul.py b/assets/root/uidragonsoul.py index a37123b9..fe1f58fe 100644 --- a/assets/root/uidragonsoul.py +++ b/assets/root/uidragonsoul.py @@ -20,11 +20,11 @@ import uiInventory import sys ITEM_FLAG_APPLICABLE = 1 << 14 -# 용혼석 Vnum에 대한 comment -# ITEM VNUM을 10만 자리부터, FEDCBA라고 한다면 -# FE : 용혼석 종류. D : 등급 -# C : 단계 B : 강화 -# A : 여벌의 번호들... +# Dragon soul Vnum comments +# If ITEM VNUM from 100,000s digit is represented as FEDCBA +# FE: Dragon soul type D: Grade +# C: Step B: Strength +# A: Reserved numbers class DragonSoulWindow(ui.ScriptWindow): KIND_TAP_TITLES = [uiScriptLocale.DRAGONSOUL_TAP_TITLE_1, uiScriptLocale.DRAGONSOUL_TAP_TITLE_2, @@ -226,9 +226,9 @@ class DragonSoulWindow(ui.ScriptWindow): for j in xrange(item.LIMIT_MAX_NUM): (limitType, limitValue) = item.GetLimit(j) - # 밑에서 remain_time이 0이하인지 체크 하기 때문에 임의의 양수로 초기화 + # Initialize to arbitrary positive number since we check if remain_time <= 0 below remain_time = 999 - # 일단 현재 타이머는 이 세개 뿐이다. + # Currently only these three timers exist if item.LIMIT_REAL_TIME == limitType: remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp() elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType: @@ -275,7 +275,7 @@ class DragonSoulWindow(ui.ScriptWindow): for j in xrange(item.LIMIT_MAX_NUM): (limitType, limitValue) = item.GetLimit(j) - # 밑에서 remain_time이 음수인지 체크 하기 때문에 임의의 양수로 초기화 + # Initialize to arbitrary positive number since we check if remain_time < 0 below remain_time = 999 if item.LIMIT_REAL_TIME == limitType: remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0) @@ -306,7 +306,7 @@ class DragonSoulWindow(ui.ScriptWindow): if None != self.tooltipItem: self.tooltipItem.SetTop() - # item slot 관련 함수 + # Item slot related functions def OverOutItem(self): self.wndItem.SetUsableItem(False) if None != self.tooltipItem: @@ -359,7 +359,7 @@ class DragonSoulWindow(ui.ScriptWindow): mouseModule.mouseController.DeattachObject() else: - ## 상점에서 팔도록 추가 + # # Added to be sold in shop ## 20140220 curCursorNum = app.GetCursor() @@ -377,8 +377,8 @@ class DragonSoulWindow(ui.ScriptWindow): self.wndItem.SetUseMode(False) snd.PlaySound("sound/ui/pick.wav") - ## 상점에 팔기 - ## 2014.02.20 추가 + ## Sell to shop + ## Added 2014.02.20 def __SellItem(self, itemSlotPos): if not player.IsDSEquipmentSlot(player.DRAGON_SOUL_INVENTORY, itemSlotPos): self.sellingSlotNumber = itemSlotPos @@ -412,21 +412,21 @@ class DragonSoulWindow(ui.ScriptWindow): self.questionDialog.Open() self.questionDialog.count = itemCount - ## 상점에 팔기 + ## Sell to shop def SellItem(self): net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.DRAGON_SOUL_INVENTORY) snd.PlaySound("sound/ui/money.wav") self.OnCloseQuestionDialog() - ## 상점에 팔기 + ## Sell to shop def OnCloseQuestionDialog(self): if self.questionDialog: self.questionDialog.Close() self.questionDialog = None - ## 상점에 팔기 + ## Sell to shop def __OnClosePopupDialog(self): self.pop = None @@ -478,7 +478,7 @@ class DragonSoulWindow(ui.ScriptWindow): return slotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, slotIndex) try: - # 용혼석 강화창이 열려있으면, 아이템 우클릭 시 자동으로 강화창으로 들어감. + # If dragon soul refine window is open, right-click automatically puts item into refine window if self.wndDragonSoulRefine.IsShow(): if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP) @@ -500,7 +500,7 @@ class DragonSoulWindow(ui.ScriptWindow): net.SendItemMovePacket(srcSlotWindow , srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount) - # equip 슬롯 관련 함수들. + # Equipment slot related functions def OverOutEquipItem(self): self.OverOutItem() @@ -529,7 +529,7 @@ class DragonSoulWindow(ui.ScriptWindow): def SelectEquipItemSlot(self, itemSlotIndex): - ## 마우스 버튼이 sell buy 체크 해서 return + ## Check for sell/buy mouse button and return curCursorNum = app.GetCursor() if app.SELL == curCursorNum: return @@ -545,7 +545,7 @@ class DragonSoulWindow(ui.ScriptWindow): if mouseModule.mouseController.isAttached(): attachedSlotType = mouseModule.mouseController.GetAttachedType() attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber() - # 자기 자신을 자기 자신에게 드래그하는 경우 + # Case of dragging item onto itself if player.SLOT_TYPE_INVENTORY == attachedSlotType and itemSlotIndex == attachedSlotPos: return @@ -592,9 +592,9 @@ class DragonSoulWindow(ui.ScriptWindow): self.__OpenQuestionDialog(True, srcItemPos, dstItemPos) mouseModule.mouseController.DeattachObject() - # equip 슬롯 관련 함수들 끝. - - # 경고창 관련 + # Equipment slot related functions end + + # Warning dialog related def __OpenQuestionDialog(self, Equip, srcItemPos, dstItemPos): self.srcItemPos = srcItemPos self.dstItemPos = dstItemPos @@ -623,7 +623,7 @@ class DragonSoulWindow(ui.ScriptWindow): self.dstItemPos = (0, 0) self.dlgQuestion.Close() - # 경고창 관련 끝 + # Warning dialog related end def SetDSKindIndex(self, kindIndex): if self.DSKindIndex != kindIndex: @@ -656,7 +656,7 @@ class DragonSoulWindow(ui.ScriptWindow): self.RefreshEquipSlotWindow() - # 용혼석 활성화 관련 + # Dragon soul activation related def ActivateDragonSoulByExtern(self, deck): self.isActivated = True self.activateButton.Down() @@ -701,24 +701,24 @@ class DragonSoulWindow(ui.ScriptWindow): for i in xrange(item.LIMIT_MAX_NUM): (limitType, limitValue) = item.GetLimit(i) - # LIMIT_TIMER_BASED_ON_WEAR는 소켓0에 남은 시간을 박는다. - # LIMIT_REAL_TIME은 시간 다 되면 아이템이 사라지므로 할 필요가 없다. - # LIMIT_REAL_TIME_START_FIRST_USE는 서버에 제대로 정의되지 않아 일단 냅둔다. + # LIMIT_TIMER_BASED_ON_WEAR stores remaining time in socket0 + # LIMIT_REAL_TIME makes item disappear when time expires, so no need to check + # LIMIT_REAL_TIME_START_FIRST_USE not properly defined on server, leave as is if item.LIMIT_TIMER_BASED_ON_WEAR == limitType: isNoLimit = False remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) if 0 != remain_time: canActiveNum += 1 break - # 타이머가 없다면 Activate할 수 있는 용혼석. + # Dragon soul can be activated if it has no timer if isNoLimit: canActiveNum += 1 return canActiveNum > 0 - # 활성화 관련 끝 - - # 슬롯 highlight 관련 + # Activation related end + + # Slot highlight related def __HighlightSlot_ClearCurrentPage(self): for i in xrange(self.wndItem.GetSlotCount()): slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i) @@ -735,14 +735,14 @@ class DragonSoulWindow(ui.ScriptWindow): def HighlightSlot(self, slot): if not slot in self.listHighlightedSlot: self.listHighlightedSlot.append (slot) - # 슬롯 highlight 관련 끝 + # Slot highlight related end def SetDragonSoulRefineWindow(self, wndDragonSoulRefine): if app.ENABLE_DRAGON_SOUL_SYSTEM: from _weakref import proxy self.wndDragonSoulRefine = proxy(wndDragonSoulRefine) -## 강화할 수 없는 경우 날리는 예외 +## Exception raised when refining is not possible #class DragonSoulRefineException(Exception): #pass @@ -879,7 +879,7 @@ class DragonSoulRefineWindow(ui.ScriptWindow): def SetItemToolTip(self, tooltipItem): self.tooltipItem = tooltipItem - # 버튼 눌려 있는 상태를 제외한 모든 강화창 관련 변수들을 초기화. + # Initialize all refine window variables except button pressed state def __Initialize(self): self.currentRecipe = {} self.refineItemInfo = {} @@ -897,7 +897,7 @@ class DragonSoulRefineWindow(ui.ScriptWindow): def __FlushRefineItemSlot(self): ## Item slot settings - # 원래 인벤의 아이템 카운트 회복 + # Restore original inventory item count for invenType, invenPos, itemCount in self.refineItemInfo.values(): remainCount = player.GetItemCount(invenType, invenPos) player.SetItemCount(invenType, invenPos, remainCount + itemCount) @@ -948,33 +948,33 @@ class DragonSoulRefineWindow(ui.ScriptWindow): raise Exception, ("Invalid attachedItemCount(%d). (base pos (%d, %d), base itemCount(%d))" % (itemCount, invenType, invenPos, maxCount)) #return False - # strength 강화일 경우, 0번엔 강화석, 1번엔 용혼석을 놓도록 강제함. + # For strength refining, force slot 0 for refine stone and slot 1 for dragon soul if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType: if self.__IsDragonSoul(itemVnum): dstSlotIndex = 1 else: dstSlotIndex = 0 - # 빈 슬롯이어야함. + # Must be empty slot if dstSlotIndex in self.refineItemInfo: return False - - # 강화창에 올릴 수 있는 아이템인지 검사. + + # Check if item can be placed in refine window if False == self.__CheckCanRefine(itemVnum): return False - - # 끌어다 놓은 아이템 카운트만큼 원래 자리의 아이템 카운트 감소 + + # Decrease original slot item count by dragged amount player.SetItemCount(invenType, invenPos, maxCount - itemCount) self.refineItemInfo[dstSlotIndex] = (invenType, invenPos, itemCount) self.Refresh() return True - # 강화 가능한 아이템인지 체크 - # 용혼석 강화는 강화 레시피를 정해놓고 시작하는 것이 아니라, - # 처음에 강화창에 올린 용혼석에 의해 강화 레시피가 결정된다. - # 그래서 __CanRefineGrade, __CanRefineStep, __CanRefineStrength 함수에서 - # 강화 레시피가 없다면(처음 올리는 아이템이라면), 강화 레시피를 설정해주는 역할도 한다. + # Check if item can be refined + # Dragon soul refining doesn't start with a predetermined recipe + # The refine recipe is determined by the first dragon soul placed in the refine window + # So __CanRefineGrade, __CanRefineStep, __CanRefineStrength functions also + # set the refine recipe if there isn't one (if it's the first item placed) def __CheckCanRefine(self, vnum): if self.REFINE_TYPE_GRADE == self.currentRefineType: return self.__CanRefineGrade(vnum) @@ -1001,19 +1001,19 @@ class DragonSoulRefineWindow(ui.ScriptWindow): if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade): self.__PopUp(localeInfo.DRAGON_SOUL_INVALID_DRAGON_SOUL) return False - # 강화 창에 처음 아이템을 올리는 경우, 강화 재료에 관한 정보가 없다. - # 용혼석 강화가, 레시피를 가지고 시작하는 것이 아니라, 강화창에 처음 올리는 아이템이 무엇이냐에 따라, - # 무엇을 강화하고, 재료가 무엇인지(이하 레시피)가 정해진다. - # 레시피가 없다면, 처음 올린 아이템이라 생각하고, vnum을 바탕으로 레시피를 셋팅. + # When placing first item in refine window, there's no material information + # Dragon soul refining doesn't start with a recipe - what to refine and + # what materials are needed (recipe) is determined by the first item placed + # If no recipe exists, assume it's the first item and set recipe based on vnum else: self.currentRecipe = self.__GetRefineGradeRecipe(vnum) if self.currentRecipe: self.refineSlotLockStartIndex = self.currentRecipe["need_count"] - self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"])) + self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"])) return True else: - # 강화 정보 셋팅에 실패하면 올릴 수 없는 아이템으로 판단. + # If recipe setup fails, item cannot be placed self.__PopUp(localeInfo.DRAGON_SOUL_CANNOT_REFINE) return False @@ -1030,25 +1030,25 @@ class DragonSoulRefineWindow(ui.ScriptWindow): if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade and cur_refine_step == step): self.__PopUp(localeInfo.DRAGON_SOUL_INVALID_DRAGON_SOUL) return False - # 강화 창에 처음 아이템을 올리는 경우, 재료에 관한 정보가 없다. - # 용혼석 강화가, 레시피를 가지고 시작하는 것이 아니라, 강화창에 처음 올리는 아이템이 무엇이냐에 따라, - # 무엇을 강화하고, 재료가 무엇인지(이하 레시피)가 정해진다. - # 레시피가 없다면, 처음 올린 아이템이라 생각하고, vnum을 바탕으로 레시피를 셋팅. + # When placing first item in refine window, there's no material information + # Dragon soul refining doesn't start with a recipe - what to refine and + # what materials are needed (recipe) is determined by the first item placed + # If no recipe exists, assume it's the first item and set recipe based on vnum else: self.currentRecipe = self.__GetRefineStepRecipe(vnum) if self.currentRecipe: self.refineSlotLockStartIndex = self.currentRecipe["need_count"] - self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"])) + self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"])) return True else: - # 강화 정보 셋팅에 실패하면 올릴 수 없는 아이템으로 판단. + # If recipe setup fails, item cannot be placed self.__PopUp(localeInfo.DRAGON_SOUL_CANNOT_REFINE) return False def __CanRefineStrength (self, vnum): - # 용혼석인 경우, 더 이상 strength 강화를 할 수 없는지 체크해야함. + # For dragon souls, check if strength refining is no longer possible if self.__IsDragonSoul(vnum): ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum) @@ -1060,10 +1060,10 @@ class DragonSoulRefineWindow(ui.ScriptWindow): else: return True - # strength 강화의 경우, refine_recipe가 용혼석의 종류가 아닌, 강화석의 종류에 따라 달라진다. - # 따라서 용혼석이 아니라면, - # 이미 레시피가 있는 경우는, 강화석이 강화창에 있다는 것이므로, return False - # 레시피가 없는 경우는, 강화석인지 확인하고, 레시피를 셋팅한다. + # For strength refining, refine_recipe depends on refine stone type, not dragon soul type + # So if it's not a dragon soul: + # If recipe already exists, refine stone is in window, so return False + # If no recipe, check if it's a refine stone and set recipe else: if self.currentRecipe: self.__PopUp(localeInfo.DRAGON_SOUL_IS_NOT_DRAGON_SOUL) @@ -1075,7 +1075,7 @@ class DragonSoulRefineWindow(ui.ScriptWindow): self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"])) return True else: - # 레시피를 셋팅할 수 없는 경우 + # Cannot set recipe self.__PopUp(localeInfo.DRAGON_SOUL_NOT_DRAGON_SOUL_REFINE_STONE) return False @@ -1105,11 +1105,11 @@ class DragonSoulRefineWindow(ui.ScriptWindow): except: return None - # strength 강화의 경우, refineInfo는 강화석에 따라 달라진다. + # For strength refining, refineInfo depends on the refine stone def __GetRefineStrengthInfo (self, itemVnum): try: - # 이놈의 위치를 어찌하지.... - # 강화석이 아니면 안됨. + # Where to put this... + # Must be a refine stone item.SelectItem(itemVnum) if not (item.ITEM_TYPE_MATERIAL == item.GetItemType() \ and (item.MATERIAL_DS_REFINE_NORMAL <= item.GetItemSubType() and item.GetItemSubType() <= item.MATERIAL_DS_REFINE_HOLLY)): @@ -1124,11 +1124,11 @@ class DragonSoulRefineWindow(ui.ScriptWindow): item.SelectItem(vnum) return item.GetItemType() == item.ITEM_TYPE_DS - # 용혼석 Vnum에 대한 comment - # ITEM VNUM을 10만 자리부터, FEDCBA라고 한다면 - # FE : 용혼석 종류. D : 등급 - # C : 단계 B : 강화 - # A : 여벌의 번호들... + # Dragon soul Vnum comments + # If ITEM VNUM from 100,000s digit is represented as FEDCBA + # FE: Dragon soul type D: Grade + # C: Step B: Strength + # A: Reserved numbers def __GetDragonSoulTypeInfo(self, vnum): if not self.__IsDragonSoul(vnum): return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO @@ -1142,7 +1142,7 @@ class DragonSoulRefineWindow(ui.ScriptWindow): def __MakeDragonSoulVnum(self, ds_type, grade, step, strength): return ds_type * 10000 + grade * 1000 + step * 100 + strength * 10 - ## 빈 슬롯 선택 Event + ## Empty slot selection event def __SelectRefineEmptySlot(self, selectedSlotPos): try: if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1: @@ -1177,14 +1177,14 @@ class DragonSoulRefineWindow(ui.ScriptWindow): import dbg dbg.TraceError("Exception : __SelectRefineEmptySlot, %s" % e) - # 클릭으로 슬롯에서 삭제. + # Remove from slot by clicking def __SelectRefineItemSlot(self, selectedSlotPos): if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1: return try: if not selectedSlotPos in self.refineItemInfo: - # 새로운 아이템을 강화창에 올리는 작업. + # Place new item in refine window if mouseModule.mouseController.isAttached(): attachedSlotType = mouseModule.mouseController.GetAttachedType() attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber() @@ -1211,26 +1211,26 @@ class DragonSoulRefineWindow(ui.ScriptWindow): attachedInvenType, attachedSlotPos, attachedItemCount = self.refineItemInfo[selectedSlotPos] selectedItemVnum = player.GetItemIndex(attachedInvenType, attachedSlotPos) - - # 강화창에서 삭제 및 원래 인벤의 아이템 카운트 회복 + + # Remove from refine window and restore original inventory item count invenType, invenPos, itemCount = self.refineItemInfo[selectedSlotPos] remainCount = player.GetItemCount(invenType, invenPos) player.SetItemCount(invenType, invenPos, remainCount + itemCount) del self.refineItemInfo[selectedSlotPos] - - # 강화창이 비었다면, 초기화 + + # If refine window is empty, initialize if not self.refineItemInfo: self.__Initialize() else: item.SelectItem(selectedItemVnum) - # 없앤 아이템이 강화석이었다면 강화 레피시 초기화 + # If removed item was refine stone, reset refine recipe if (item.ITEM_TYPE_MATERIAL == item.GetItemType() \ and (item.MATERIAL_DS_REFINE_NORMAL <= item.GetItemSubType() and item.GetItemSubType() <= item.MATERIAL_DS_REFINE_HOLLY)): self.currentRecipe = {} self.wndMoney.SetText(localeInfo.NumberToMoneyString(0)) - # 용혼석이었다면, - # strength강화가 아닌 경우, 강화창에 다른 용혼석이 남아있으므로, 레시피를 초기화하면 안됨. - # strength강화의 경우, 강화 레시피는 강화석에 종속된 것이므로 다른 처리할 필요가 없음. + # If it was a dragon soul: + # For non-strength refining, don't reset recipe since other dragon souls remain in window + # For strength refining, no special handling needed since recipe depends on refine stone else: pass @@ -1277,10 +1277,10 @@ class DragonSoulRefineWindow(ui.ScriptWindow): for slotPos in xrange(self.wndRefineSlot.GetSlotCount()): self.wndRefineSlot.ClearSlot(slotPos) if slotPos < self.refineSlotLockStartIndex: - # self.refineItemInfo[slotPos]의 정보확인 - # (실제로 아이템이 존재하는지 확인) - # 존재 -> 아이템 아이콘을 슬롯에 셋팅. - # 비존재 -> 아이템이 없으므로 강화창에서 삭제. + # Check self.refineItemInfo[slotPos] information + # (check if item actually exists) + # Exists -> Set item icon to slot + # Doesn't exist -> Remove from refine window since there's no item if slotPos in self.refineItemInfo: invenType, invenPos, itemCount = self.refineItemInfo[slotPos] itemVnum = player.GetItemIndex(invenType, invenPos) @@ -1291,12 +1291,12 @@ class DragonSoulRefineWindow(ui.ScriptWindow): else: del self.refineItemInfo[slotPos] - # 빈 슬롯에 reference 아이콘을 alpha 0.5로 셋팅. + # Set reference icon with alpha 0.5 for empty slot if not slotPos in self.refineItemInfo: try: reference_vnum = 0 - # strength 강화일 때는, - # 0번 슬롯에 강화석을, 1번 슬롯에 용혼석을 놓는다. + # For strength refining: + # Slot 0 for refine stone, slot 1 for dragon soul if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType: if DragonSoulRefineWindow.REFINE_STONE_SLOT == slotPos: reference_vnum = 100300 @@ -1307,28 +1307,27 @@ class DragonSoulRefineWindow(ui.ScriptWindow): itemIcon = item.GetIconImage() (width, height) = item.GetItemSize() self.wndRefineSlot.SetSlot(slotPos, 0, width, height, itemIcon, (1.0, 1.0, 1.0, 0.5)) - # slot 우측 하단에 숫자 뜨면 안 예쁨... + # Don't show number in bottom right of slot, looks bad self.wndRefineSlot.SetSlotCount(slotPos, 0) except: pass - # refineSlotLockStartIndex 보다 작은 슬롯은 닫힌 이미지를 보여주면 안됨. + # Slots smaller than refineSlotLockStartIndex shouldn't show closed image self.wndRefineSlot.HideSlotBaseImage(slotPos) # slotPos >= self.refineSlotLockStartIndex: else: - # 정상적인 경우라면 이 if문에 들어갈 일은 없겠지만, - # (애초에 인덱스가 refineSlotLockStartIndex 이상인 슬롯에는 아이템을 넣지 못하게 했기 때문) - # 혹시 모를 에러에 대비함. + # Normally this if statement shouldn't execute + # (since we prevented items from being placed in slots >= refineSlotLockStartIndex) + # But handle just in case of error if slotPos in self.refineItemInfo: invenType, invenPos, itemCount = self.refineItemInfo[slotPos] remainCount = player.GetItemCount(invenType, invenPos) player.SetItemCount(invenType, invenPos, remainCount + itemCount) del self.refineItemInfo[slotPos] - # refineSlotLockStartIndex 이상인 슬롯은 닫힌 이미지를 보여줘야함. + # Slots >= refineSlotLockStartIndex should show closed image self.wndRefineSlot.ShowSlotBaseImage(slotPos) - - # 강화창에 아무런 아이템이 없다면, 초기화해줌. - # 위에서 중간 중간에 "del self.refineItemInfo[slotPos]"를 했기 때문에, - # 여기서 한번 체크해줘야함. + + # If there are no items in refine window, initialize + # Need to check here since we did "del self.refineItemInfo[slotPos]" above if not self.refineItemInfo: self.__Initialize() @@ -1338,8 +1337,8 @@ class DragonSoulRefineWindow(ui.ScriptWindow): dbg.TraceError("Exception : __RefreshRefineItemSlot, %s" % e) def __GetEmptySlot(self, itemVnum = 0): - # STRENGTH 강화의 경우, 용혼석 슬롯과 강화석 슬롯이 구분되어있기 떄문에 - # vnum을 알아야 한다. + # For STRENGTH refining, dragon soul slot and refine stone slot are separate + # so we need to know the vnum if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType: if 0 == itemVnum: return -1 diff --git a/assets/root/uiguild.py b/assets/root/uiguild.py index b3bf169c..8969ba01 100644 --- a/assets/root/uiguild.py +++ b/assets/root/uiguild.py @@ -636,7 +636,7 @@ class CommentSlot(ui.Window): self.slotSimpleText = ui.MakeTextLine(self) self.slotSimpleText.SetPosition(2, 0) - ## 13.12.02 ƶ + ## 13.12.02 Arabic modification if app.IsRTL() : self.slotSimpleText.SetWindowHorizontalAlignCenter() self.slotSimpleText.SetHorizontalAlignCenter() @@ -1000,7 +1000,7 @@ class GuildWindow(ui.ScriptWindow): page.Children.append(noticeMarkImage) ## Name - ## 13.12.02 ƶ + ## 13.12.02 Arabic modification if app.IsRTL(): nameSlotImage = ui.MakeImageBox(page, "d:/ymir work/ui/public/Parameter_Slot_03.sub", 255, yPos) else: @@ -1018,7 +1018,7 @@ class GuildWindow(ui.ScriptWindow): page.Children.append(deleteButton) ## Comment - ## 13.12.02 ƶ + ## 13.12.02 Arabic modification commentSlot = CommentSlot() commentSlot.SetParent(page) if app.IsRTL(): @@ -1035,7 +1035,7 @@ class GuildWindow(ui.ScriptWindow): page.boardDict[i] = boardSlotList ## PostComment - Have to make this here for that fit tooltip's position. - ## 13.12.02 ƶ + ## 13.12.02 Arabic modification if app.IsRTL(): postCommentButton = ui.MakeButton(page, 3, 273, localeInfo.GUILD_COMMENT, "d:/ymir work/ui/game/taskbar/", "Send_Chat_Button_01.sub", "Send_Chat_Button_02.sub", "Send_Chat_Button_03.sub") else: @@ -1054,7 +1054,7 @@ class GuildWindow(ui.ScriptWindow): inverseLineIndex = self.MEMBER_LINE_COUNT - i - 1 yPos = 28 + inverseLineIndex*lineStep - ## 13.12.02 ƶ + ## 13.12.02 Arabic modification ## Name if app.IsRTL(): nameSlotImage = ui.MakeImageBox(page, "d:/ymir work/ui/public/Parameter_Slot_100x18.sub", 255, yPos) @@ -1226,7 +1226,7 @@ class GuildWindow(ui.ScriptWindow): yPos = 22 + i*lineStep index = i+1 - ## 13.12.02 ƶ + ## 13.12.02 Arabic modification ## GradeNumber if app.IsRTL(): gradeNumberSlotImage = ui.MakeImageBox(page, "d:/ymir work/ui/public/Parameter_Slot_00.sub", 310, yPos) @@ -1299,7 +1299,7 @@ class GuildWindow(ui.ScriptWindow): guildID = net.GetGuildID() self.largeMarkBox.SetIndex(guildID) self.largeMarkBox.SetScale(3) - ## 13.12.02 ƶ + ## 13.12.02 Arabic modification if app.IsRTL(): self.largeMarkBox.SetPosition(self.largeMarkBox.GetWidth()+32,1) @@ -1419,7 +1419,7 @@ class GuildWindow(ui.ScriptWindow): page.levelAverageSlot.SetText(str(guild.GetGuildMemberLevelAverage())) - ## 常 ũ û ư + ## Only guild master can see guild mark and guild war request buttons mainCharacterName = player.GetMainCharacterName() masterName = guild.GetGuildMasterName() @@ -1440,7 +1440,7 @@ class GuildWindow(ui.ScriptWindow): page.declareWarButton.Hide() page.uploadSymbolButton.Hide() - ## Refresh ÿ Ʈ + ## Update guild war information on refresh for i in xrange(guild.ENEMY_GUILD_SLOT_MAX_COUNT): name = guild.GetEnemyGuildName(i) nameTextLine = self.enemyGuildNameList[i] @@ -2110,7 +2110,7 @@ class BuildGuildBuildingWindow(ui.ScriptWindow): line_width = line_maxX - line_minX line_width_half = line_width / 2 - X_SIZE_STEP = 2 * 2 ## 2 θ ؾ + X_SIZE_STEP = 2 * 2 ## Must increase only in units of 2 Y_SIZE_STEP = 8 sxPos = door_maxX - corner_minX + (line_width_half*X_SIZE_STEP) exPos = -sxPos @@ -2286,14 +2286,14 @@ class BuildGuildBuildingWindow(ui.ScriptWindow): self.popup = None def __EnablePCBlocker(self): - ## PC Blocker ó Ҵ. () + ## Enable PC Blocker processing (becomes transparent) chr.SetInstanceType(chr.INSTANCE_TYPE_BUILDING) for idx in self.indexList: chr.SetBlendRenderMode(idx, 1.0) def __DisablePCBlocker(self): - ## PC Blocker ó . () + ## Disable PC Blocker processing (stays opaque) chr.SetInstanceType(chr.INSTANCE_TYPE_OBJECT) for idx in self.indexList: @@ -2544,13 +2544,13 @@ class BuildGuildBuildingWindow(ui.ScriptWindow): return True """ -- +- Protocol -ӵԽ: +On game entry: RecvLandPacket: CPythonMiniMap::RegisterGuildArea -̵: +During game movement: PythonPlayer::Update() CPythonPlayer::__Update_NotifyGuildAreaEvent() game.py.BINARY_Guild_EnterGuildArea @@ -2559,15 +2559,15 @@ class BuildGuildBuildingWindow(ui.ScriptWindow): uigameButton.GameButtonWindow.HideBuildButton() BuildButton: -! ó -!ǹ ־ ư +!No guild master check +!Build button exists even if building present -!ǹ ӽ÷ ϴ VID ִ Ͱ ȥ -!ǹ VNUM BuildGuildBuildingWindow.BUILDING_VNUM_LIST ̿ ȯ +!Building temporary VID may be confused with server-sent VID +!Building VNUM converted using BuildGuildBuildingWindow.BUILDING_VNUM_LIST -!ǹ /build c(reate) -!ǹ μ /build d(estroy) -!rotation degree +!To build: /build c(reate) +!To destroy: /build d(estroy) +!Rotation unit is degree interfaceModule.interface.__OnClickBuildButton: interfaceModule.interface.BUILD_OpenWindow: @@ -2580,7 +2580,7 @@ PreviewButton: __OnPreviewMode: __RestoreViewMode: -ǹ μ: +Destroy building: uiTarget.TargetBoard.__OnDestroyBuilding net.SendChatPacket("/build d vid") """ @@ -2822,13 +2822,13 @@ if __name__ == "__main__": app.Loop() """ - - + - Protocol -ӵԽ: +On game entry: RecvLandPacket: CPythonMiniMap::RegisterGuildArea -̵: +During game movement: PythonPlayer::Update() CPythonPlayer::__Update_NotifyGuildAreaEvent() game.py.BINARY_Guild_EnterGuildArea @@ -2837,15 +2837,15 @@ if __name__ == "__main__": uigameButton.GameButtonWindow.HideBuildButton() BuildButton: -! ó -!ǹ ־ ư +!No guild master check +!Build button exists even if building present -!ǹ ӽ÷ ϴ VID ִ Ͱ ȥ -!ǹ VNUM BuildGuildBuildingWindow.BUILDING_VNUM_LIST ̿ ȯ +!Building temporary VID may be confused with server-sent VID +!Building VNUM converted using BuildGuildBuildingWindow.BUILDING_VNUM_LIST -!ǹ /build c(reate) -!ǹ μ /build d(estroy) -!rotation degree +!To build: /build c(reate) +!To destroy: /build d(estroy) +!Rotation unit is degree interfaceModule.interface.__OnClickBuildButton: interfaceModule.interface.BUILD_OpenWindow: @@ -2854,13 +2854,13 @@ AcceptButton: BuildGuildBuildingWindow.Build: net.SendChatPacket("/build c vnum x y x_rot y_rot z_rot") - x_rot, y_rot AffectContainer + x_rot, y_rot stored in AffectContainer PreviewButton: __OnPreviewMode: __RestoreViewMode: -ǹ μ: +Destroy building: uiTarget.TargetBoard.__OnDestroyBuilding net.SendChatPacket("/build d vid") """ diff --git a/assets/root/uiinventory.py b/assets/root/uiinventory.py index 870bc0ff..c50c4bf5 100644 --- a/assets/root/uiinventory.py +++ b/assets/root/uiinventory.py @@ -13,7 +13,7 @@ import uiRefine import uiAttachMetin import uiPickMoney import uiCommon -import uiPrivateShopBuilder # 개인상점 열동안 ItemMove 방지 +import uiPrivateShopBuilder # Prevent ItemMove while private shop is open import localeInfo import constInfo import ime @@ -156,7 +156,7 @@ class BeltInventoryWindow(ui.ScriptWindow): if app.IsRTL() == 0: self.AdjustPositionAndSize() - ## 현재 인벤토리 위치를 기준으로 BASE 위치를 계산, 리턴.. 숫자 하드코딩하기 정말 싫지만 방법이 없다.. + ## Calculate and return BASE position based on current inventory position. Hard-coded numbers are unavoidable. def GetBasePosition(self): x, y = self.wndInventory.GetGlobalPosition() return x - 148, y + 241 @@ -251,13 +251,13 @@ class InventoryWindow(ui.ScriptWindow): sellingSlotNumber = -1 isLoaded = 0 - isOpenedCostumeWindowWhenClosingInventory = 0 # 인벤토리 닫을 때 코스츔이 열려있었는지 여부-_-; 네이밍 ㅈㅅ - isOpenedBeltWindowWhenClosingInventory = 0 # 인벤토리 닫을 때 벨트 인벤토리가 열려있었는지 여부-_-; 네이밍 ㅈㅅ + isOpenedCostumeWindowWhenClosingInventory = 0 # Whether costume window was open when closing inventory + isOpenedBeltWindowWhenClosingInventory = 0 # Whether belt inventory was open when closing inventory def __init__(self): ui.ScriptWindow.__init__(self) - self.isOpenedBeltWindowWhenClosingInventory = 0 # 인벤토리 닫을 때 벨트 인벤토리가 열려있었는지 여부-_-; 네이밍 ㅈㅅ + self.isOpenedBeltWindowWhenClosingInventory = 0 # Whether belt inventory was open when closing inventory self.__LoadWindow() @@ -269,11 +269,11 @@ class InventoryWindow(ui.ScriptWindow): ui.ScriptWindow.Show(self) - # 인벤토리를 닫을 때 코스츔이 열려있었다면 인벤토리를 열 때 코스츔도 같이 열도록 함. + # If costume window was open when closing inventory, open it again when opening inventory. if self.isOpenedCostumeWindowWhenClosingInventory and self.wndCostume: self.wndCostume.Show() - # 인벤토리를 닫을 때 벨트 인벤토리가 열려있었다면 같이 열도록 함. + # If belt inventory was open when closing inventory, open it again. if self.wndBelt: self.wndBelt.Show(self.isOpenedBeltWindowWhenClosingInventory) @@ -439,11 +439,11 @@ class InventoryWindow(ui.ScriptWindow): self.tooltipItem.HideToolTip() if self.wndCostume: - self.isOpenedCostumeWindowWhenClosingInventory = self.wndCostume.IsShow() # 인벤토리 창이 닫힐 때 코스츔이 열려 있었는가? + self.isOpenedCostumeWindowWhenClosingInventory = self.wndCostume.IsShow() # Was costume window open when inventory was closed? self.wndCostume.Close() if self.wndBelt: - self.isOpenedBeltWindowWhenClosingInventory = self.wndBelt.IsOpeningInventory() # 인벤토리 창이 닫힐 때 벨트 인벤토리도 열려 있었는가? + self.isOpenedBeltWindowWhenClosingInventory = self.wndBelt.IsOpeningInventory() # Was belt inventory open when inventory was closed? print "Is Opening Belt Inven?? ", self.isOpenedBeltWindowWhenClosingInventory self.wndBelt.Close() @@ -508,7 +508,7 @@ class InventoryWindow(ui.ScriptWindow): self.dlgPickMoney.SetTitleName(localeInfo.PICK_MONEY_TITLE) self.dlgPickMoney.SetAcceptEvent(ui.__mem_func__(self.OnPickMoney)) self.dlgPickMoney.Open(curMoney) - self.dlgPickMoney.SetMax(7) # 인벤토리 990000 제한 버그 수정 + self.dlgPickMoney.SetMax(7) # Fixed inventory 990000 limit bug def OnPickMoney(self, money): mouseModule.mouseController.AttachMoney(self, player.SLOT_TYPE_INVENTORY, money) @@ -533,7 +533,7 @@ class InventoryWindow(ui.ScriptWindow): slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(i) itemCount = getItemCount(slotNumber) - # itemCount == 0이면 소켓을 비운다. + # If itemCount == 0, clear the slot. if 0 == itemCount: self.wndItem.ClearSlot(i) continue @@ -543,9 +543,9 @@ class InventoryWindow(ui.ScriptWindow): itemVnum = getItemVNum(slotNumber) setItemVNum(i, itemVnum, itemCount) - ## 자동물약 (HP: #72723 ~ #72726, SP: #72727 ~ #72730) 특수처리 - 아이템인데도 슬롯에 활성화/비활성화 표시를 위한 작업임 - [hyo] + ## Auto-potion special handling (HP: #72723~#72726, SP: #72727~#72730) - Display activation/deactivation in slot even though it's an item - [hyo] if constInfo.IS_AUTO_POTION(itemVnum): - # metinSocket - [0] : 활성화 여부, [1] : 사용한 양, [2] : 최대 용량 + # metinSocket - [0]: Activation status, [1]: Amount used, [2]: Maximum capacity metinSocket = [player.GetItemMetinSocket(slotNumber, j) for j in xrange(player.METIN_SOCKET_MAX_NUM)] if slotNumber >= player.INVENTORY_PAGE_SIZE * self.inventoryPageIndex: @@ -614,7 +614,7 @@ class InventoryWindow(ui.ScriptWindow): def SellItem(self): if self.sellingSlotitemIndex == player.GetItemIndex(self.sellingSlotNumber): if self.sellingSlotitemCount == player.GetItemCount(self.sellingSlotNumber): - ## 용혼석도 팔리게 하는 기능 추가하면서 인자 type 추가 + ## Added type argument to enable selling dragon soul stones net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.INVENTORY) snd.PlaySound("sound/ui/money.wav") self.OnCloseQuestionDialog() @@ -764,10 +764,10 @@ class InventoryWindow(ui.ScriptWindow): else: #snd.PlaySound("sound/ui/drop.wav") - ## 이동시킨 곳이 장착 슬롯일 경우 아이템을 사용해서 장착 시킨다 - [levites] + ## If destination is an equipment slot, use item to equip it - [levites] if player.IsEquipmentSlot(dstItemSlotPos): - ## 들고 있는 아이템이 장비일때만 + ## Only when holding equipment item if item.IsEquipmentVID(srcItemVID): self.__UseItem(srcItemSlotPos) @@ -786,7 +786,7 @@ class InventoryWindow(ui.ScriptWindow): self.sellingSlotitemCount = itemCount item.SelectItem(itemIndex) - ## 안티 플레그 검사 빠져서 추가 + ## Added anti-flag check that was missing ## 20140220 if item.IsAntiFlag(item.ANTIFLAG_SELL): popup = uiCommon.PopupDialog() @@ -932,7 +932,7 @@ class InventoryWindow(ui.ScriptWindow): def __IsUsableItemToItem(self, srcItemVNum, srcSlotPos): - "다른 아이템에 사용할 수 있는 아이템인가?" + "Can this item be used on other items?" if item.IsRefineScroll(srcItemVNum): return True @@ -951,7 +951,7 @@ class InventoryWindow(ui.ScriptWindow): return False def __CanUseSrcItemToDstItem(self, srcItemVNum, srcSlotPos, dstSlotPos): - "대상 아이템에 사용할 수 있는가?" + "Can this item be used on the target item?" if srcSlotPos == dstSlotPos: return False @@ -1158,7 +1158,7 @@ class InventoryWindow(ui.ScriptWindow): self.OnCloseQuestionDialog() def __SendUseItemToItemPacket(self, srcSlotPos, dstSlotPos): - # 개인상점 열고 있는 동안 아이템 사용 방지 + # Prevent item usage while private shop is open if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP) return @@ -1166,7 +1166,7 @@ class InventoryWindow(ui.ScriptWindow): net.SendItemUseToItemPacket(srcSlotPos, dstSlotPos) def __SendUseItemPacket(self, slotPos): - # 개인상점 열고 있는 동안 아이템 사용 방지 + # Prevent item usage while private shop is open if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP) return @@ -1174,7 +1174,7 @@ class InventoryWindow(ui.ScriptWindow): net.SendItemUsePacket(slotPos) def __SendMoveItemPacket(self, srcSlotPos, dstSlotPos, srcItemCount): - # 개인상점 열고 있는 동안 아이템 사용 방지 + # Prevent item movement while private shop is open if uiPrivateShopBuilder.IsBuildingPrivateShop(): chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP) return diff --git a/assets/root/uiphasecurtain.py b/assets/root/uiphasecurtain.py index 107420a2..e0501a19 100644 --- a/assets/root/uiphasecurtain.py +++ b/assets/root/uiphasecurtain.py @@ -49,11 +49,11 @@ class PhaseCurtain(ui.Bar): if self.curAlpha >= 1.0: self.curAlpha = 1.0 - # ̺Ʈ ߰ 츦 ̸ + # Use only this timer when event fade out was added event=self.event self.event = 0 - #print "̵ ƿ Ϸ ̺Ʈ " + #print "Fade out complete event executed" if -1 != self.args: event(self.args) diff --git a/assets/root/uiprivateshopbuilder.py b/assets/root/uiprivateshopbuilder.py index 3e8f7827..ac7cdf11 100644 --- a/assets/root/uiprivateshopbuilder.py +++ b/assets/root/uiprivateshopbuilder.py @@ -9,8 +9,8 @@ import uiCommon import localeInfo import chat import item -import systemSetting #ȣ -import player #ȣ +import systemSetting +import player g_isBuildingPrivateShop = False @@ -106,7 +106,7 @@ class PrivateShopAdvertisementBoard(ui.ThinBoard): else: for key in g_privateShopAdvertisementBoardDict.keys(): - if player.GetMainCharacterIndex() == key: #dz Ⱥ̰ ߴ 쿡, ÷̾ ڽ dz ̵ . by ȣ + if player.GetMainCharacterIndex() == key: # When the private shop is visible and closed, the player's own shop ID changes. g_privateShopAdvertisementBoardDict[key].Show() x, y = chr.GetProjectPosition(player.GetMainCharacterIndex(), 220) g_privateShopAdvertisementBoardDict[key].SetPosition(x - self.GetWidth()/2, y - self.GetHeight()/2) diff --git a/assets/root/uiquest.py b/assets/root/uiquest.py index 63214fa0..f916e277 100644 --- a/assets/root/uiquest.py +++ b/assets/root/uiquest.py @@ -466,7 +466,7 @@ class QuestDialog(ui.ScriptWindow): # END_OF_QUEST_CANCEL - def MakeQuestion(self, n): # n은 모든 퀘스트 대화창의 마지막 버튼인 "닫기"를 포함한 전체 퀘스트 버튼 개수. by 김준호 + def MakeQuestion(self, n): # n is the total number of quest buttons including the final "Close" button global entire_questbutton_number global entire_questpage_number global cur_questpage_number @@ -557,7 +557,7 @@ class QuestDialog(ui.ScriptWindow): self.prevbutton = None self.CloseSelf() - def AppendQuestion(self, name, idx): # idx는 0부터 시작함. PythonEventManager.cpp line 881 참고. by 김준호 + def AppendQuestion(self, name, idx): # idx starts from 0. See PythonEventManager.cpp line 881 if not self.btnAnswer: return @@ -604,7 +604,7 @@ class QuestDialog(ui.ScriptWindow): # QUEST_INPUT def OnKeyDown(self, key): if self.btnAnswer == None: - ## 선택문이 없고 '다음', '확인' 등의 일방 버튼만 있는 경우에 대한 처리 + ## Handle cases with only unidirectional buttons like 'Next' or 'OK' without choice options if None != self.btnNext: if app.DIK_RETURN == key: self.OnPressEscapeKey() @@ -649,22 +649,22 @@ class QuestDialog(ui.ScriptWindow): def OnPressEscapeKey(self): - # ESC키가 눌린 경우 "다음" 버튼을 누른 것과 같은 효과를 내도록 함. + # When ESC key is pressed, have the same effect as clicking the "Next" button. if None != self.btnNext: - ##퀘스트문자들이 전부다 나왔을경우의 ESC버튼 + ## ESC button when all quest text has been displayed if event.BUTTON_TYPE_CANCEL == self.nextButtonType: self.bCancelled = True event.SelectAnswer(self.descIndex, 254) self.CloseSelf() - ## 아무 작업을 하지 않을때 + ## When no action is being performed elif event.BUTTON_TYPE_DONE == self.nextButtonType: self.CloseSelf() - ## 엔터나 다음화면으로 넘어가려고 할경우 + ## When trying to press Enter or move to next screen elif event.BUTTON_TYPE_NEXT == self.nextButtonType: event.SelectAnswer(self.descIndex, 254) self.CloseSelf() else: - ## 도중에 꺼버리거나, ESC버튼이 나왓을경우 + ## When dialog is closed midway or ESC button appears event.SelectAnswer(self.descIndex, entire_questbutton_number -1 ) self.nextbutton = None self.prevbutton = None diff --git a/assets/root/uitaskbar.py b/assets/root/uitaskbar.py index e7287cff..79b46f7a 100644 --- a/assets/root/uitaskbar.py +++ b/assets/root/uitaskbar.py @@ -152,7 +152,7 @@ class EnergyBar(ui.ScriptWindow): def RefreshStatus(self): pointEnergy = player.GetStatus (player.ENERGY) leftTimeEnergy = player.GetStatus (player.ENERGY_END_TIME) - app.GetGlobalTimeStamp() - # 충기환 지속 시간 = 2시간. + # Energy pill duration = 2 hours. self.SetEnergy (pointEnergy, leftTimeEnergy, 7200) def SetEnergy (self, point, leftTime, maxTime): @@ -330,12 +330,12 @@ class TaskBar(ui.ScriptWindow): self.SetSkillSlotNew(slotNumber, skillIndex, skillGrade, skillLevel) self.SetSlotCountNew(slotNumber, skillGrade, skillLevel) - ## NOTE : CoolTime 체크 + ## NOTE: Check cooltime if player.IsSkillCoolTime(skillSlotNumber): (coolTime, elapsedTime) = player.GetSkillCoolTime(skillSlotNumber) self.SetSlotCoolTime(slotNumber, coolTime, elapsedTime) - ## NOTE : Activate 되어 있다면 아이콘도 업데이트 + ## NOTE: If activated, update icon as well if player.IsSkillActive(skillSlotNumber): self.ActivateSlot(slotNumber) @@ -438,7 +438,7 @@ class TaskBar(ui.ScriptWindow): toggleButtonDict[TaskBar.BUTTON_MESSENGER]=self.GetChild("MessengerButton") toggleButtonDict[TaskBar.BUTTON_SYSTEM]=self.GetChild("SystemButton") - # ChatButton, ExpandButton 둘 중 하나는 반드시 존재한다. + # Either ChatButton or ExpandButton must exist. try: toggleButtonDict[TaskBar.BUTTON_CHAT]=self.GetChild("ChatButton") except: diff --git a/assets/root/uitooltip.py b/assets/root/uitooltip.py index 1c2b1ca6..abc8324f 100644 --- a/assets/root/uitooltip.py +++ b/assets/root/uitooltip.py @@ -56,9 +56,8 @@ def SplitDescription(desc, limit): ################################################################################################### ## ToolTip -## -## NOTE : Item Skill Ưȭ ѵξ -## ״ ǹ̰ +## NOTE: Currently Item and Skill are specialized through inheritance +## However, this doesn't seem very meaningful ## class ToolTip(ui.ThinBoard): @@ -458,9 +457,8 @@ class ItemToolTip(ToolTip): ToolTip.__init__(self, *args, **kwargs) self.itemVnum = 0 self.isShopItem = False - - # ǥ ijͰ ̶ Disable Color (̹ ׷ ۵ϰ ʿ䰡 ־) - self.bCannotUseItemForceSetDisableColor = True + # When displaying item tooltip, if the current character cannot equip the item, force it to use Disable Color (already works this way but needed ability to turn it off) + self.bCannotUseItemForceSetDisableColor = True def __del__(self): ToolTip.__del__(self) @@ -873,7 +871,7 @@ class ItemToolTip(ToolTip): self.AppendSpace(5) - ## ä ǥѴ. + ## For fans, display magic attack first. if item.WEAPON_FAN == itemSubType: self.__AppendMagicAttackInfo() self.__AppendAttackPowerInfo() @@ -892,9 +890,9 @@ class ItemToolTip(ToolTip): elif item.ITEM_TYPE_ARMOR == itemType: self.__AppendLimitInformation() - ## + ## Defense defGrade = item.GetValue(1) - defBonus = item.GetValue(5)*2 ## ǥ ߸ Ǵ + defBonus = item.GetValue(5)*2 ## Fixed an issue where defense power was displayed incorrectly. if defGrade > 0: self.AppendSpace(5) self.AppendTextLine(localeInfo.TOOLTIP_ITEM_DEF_GRADE % (defGrade+defBonus), self.GetChangeTextLineColor(defGrade)) @@ -916,7 +914,7 @@ class ItemToolTip(ToolTip): self.__AppendAffectInformation() self.__AppendAttributeInformation(attrSlot) - # ý ؼ ȹ + #Planning for the ring socket system has not yet been decided #self.__AppendAccessoryMetinSlotInfo(metinSlot, 99001) @@ -928,7 +926,7 @@ class ItemToolTip(ToolTip): self.__AppendAccessoryMetinSlotInfo(metinSlot, constInfo.GET_BELT_MATERIAL_VNUM(itemVnum)) - ## ڽ ## + ## Costume Item ## elif 0 != isCostumeItem: self.__AppendLimitInformation() self.__AppendAffectInformation() @@ -938,21 +936,20 @@ class ItemToolTip(ToolTip): bHasRealtimeFlag = 0 - ## 밡 ð ִ ãƺ + # # Find out if there is limited time remaining for i in xrange(item.LIMIT_MAX_NUM): (limitType, limitValue) = item.GetLimit(i) if item.LIMIT_REAL_TIME == limitType: bHasRealtimeFlag = 1 - - ## ִٸ ǥ. ex) ð : 6 6ð 58 + + ## If exists, display related information. ex) Remaining time: 6 days 6 hours 58 minutes if 1 == bHasRealtimeFlag: self.AppendMallItemLastTime(metinSlot[0]) #dbg.TraceError("1) REAL_TIME flag On ") ## Rod ## elif item.ITEM_TYPE_ROD == itemType: - if 0 != metinSlot: curLevel = item.GetValue(0) / 10 curEXP = metinSlot[0] @@ -1035,7 +1032,7 @@ class ItemToolTip(ToolTip): else: time = metinSlot[player.METIN_SOCKET_MAX_NUM-1] - if 1 == item.GetValue(2): ## ǽð ̿ Flag / ص ش + if 1 == item.GetValue(2): ## Real-time use flag / given even if not equipped self.AppendMallItemLastTime(time) else: self.AppendUniqueItemLastTime(time) @@ -1051,7 +1048,7 @@ class ItemToolTip(ToolTip): self.__AppendAbilityPotionInformation() - ## + ## Spirit Detector if 27989 == itemVnum or 76006 == itemVnum: if 0 != metinSlot: useCount = int(metinSlot[0]) @@ -1059,7 +1056,7 @@ class ItemToolTip(ToolTip): self.AppendSpace(5) self.AppendTextLine(localeInfo.TOOLTIP_REST_USABLE_COUNT % (6 - useCount), self.NORMAL_COLOR) - ## ̺Ʈ + ## Event Detector elif 50004 == itemVnum: if 0 != metinSlot: useCount = int(metinSlot[0]) @@ -1067,10 +1064,10 @@ class ItemToolTip(ToolTip): self.AppendSpace(5) self.AppendTextLine(localeInfo.TOOLTIP_REST_USABLE_COUNT % (10 - useCount), self.NORMAL_COLOR) - ## ڵ + ## Automatic potion elif constInfo.IS_AUTO_POTION(itemVnum): if 0 != metinSlot: - ## 0: Ȱȭ, 1: 뷮, 2: ѷ + # # 0: Activate, 1: Power, 2: Cooldown isActivated = int(metinSlot[0]) usedAmount = float(metinSlot[1]) totalAmount = float(metinSlot[2]) @@ -1080,13 +1077,14 @@ class ItemToolTip(ToolTip): self.AppendSpace(5) + ## 0: active, 1: usage amount, 2: total amount if 0 != isActivated: self.AppendTextLine("(%s)" % (localeInfo.TOOLTIP_AUTO_POTION_USING), self.SPECIAL_POSITIVE_COLOR) self.AppendSpace(5) self.AppendTextLine(localeInfo.TOOLTIP_AUTO_POTION_REST % (100.0 - ((usedAmount / totalAmount) * 100.0)), self.POSITIVE_COLOR) - - ## ȯ + + ## Return Memory elif itemVnum in WARP_SCROLLS: if 0 != metinSlot: xPos = int(metinSlot[0]) @@ -1113,33 +1111,35 @@ class ItemToolTip(ToolTip): if item.LIMIT_REAL_TIME == limitType: bHasRealtimeFlag = 1 - - ## ִٸ ǥ. ex) ð : 6 6ð 58 + + ## If exists, display related information. ex) Remaining time: 6 days 6 hours 58 minutes if 1 == bHasRealtimeFlag: self.AppendMallItemLastTime(metinSlot[0]) else: - # ... ̰... ̷ ð üũ ȵǾ ִµ... - # ̷ ִ ϳ ׳ ... + # ... This... This time isn't checked on the server... + # I don't know why this exists, but let's just leave it... if 0 != metinSlot: time = metinSlot[player.METIN_SOCKET_MAX_NUM-1] - ## ǽð ̿ Flag + ## Real-time usage Flag if 1 == item.GetValue(2): self.AppendMallItemLastTime(time) elif item.USE_TIME_CHARGE_PER == itemSubType: bHasRealtimeFlag = 0 + for i in xrange(item.LIMIT_MAX_NUM): (limitType, limitValue) = item.GetLimit(i) if item.LIMIT_REAL_TIME == limitType: bHasRealtimeFlag = 1 + if metinSlot[2]: self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_PER(metinSlot[2])) else: self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_PER(item.GetValue(0))) - - ## ִٸ ǥ. ex) ð : 6 6ð 58 + + ## If available, display relevant information. ex) Time remaining: 6 days, 6 hours, 58 minutes if 1 == bHasRealtimeFlag: self.AppendMallItemLastTime(metinSlot[0]) @@ -1155,7 +1155,7 @@ class ItemToolTip(ToolTip): else: self.AppendTextLine(localeInfo.TOOLTIP_TIME_CHARGER_FIX(item.GetValue(0))) - ## ִٸ ǥ. ex) ð : 6 6ð 58 + ## If exists, display related information. ex) Remaining time: 6 days 6 hours 58 minutes if 1 == bHasRealtimeFlag: self.AppendMallItemLastTime(metinSlot[0]) @@ -1204,7 +1204,7 @@ class ItemToolTip(ToolTip): return "" - ## ΰ? + ## Is it hair? def __IsHair(self, itemVnum): return (self.__IsOldHair(itemVnum) or self.__IsNewHair(itemVnum) or @@ -1241,7 +1241,7 @@ class ItemToolTip(ToolTip): itemImage.LoadImage("d:/ymir work/item/quest/"+str(itemVnum)+".tga") elif self.__IsNewHair3(itemVnum): itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum)) - elif self.__IsNewHair(itemVnum): # ȣ Ѽ Ѵ. ο 1000ŭ ȣ þ. + elif self.__IsNewHair(itemVnum): # Use by linking to existing hair numbers. New items have numbers increased by 1000. itemImage.LoadImage("d:/ymir work/item/quest/"+str(itemVnum-1000)+".tga") elif self.__IsNewHair2(itemVnum): itemImage.LoadImage("icon/hair/%d.sub" % (itemVnum)) @@ -1254,7 +1254,7 @@ class ItemToolTip(ToolTip): self.childrenList.append(itemImage) self.ResizeToolTip() - ##  ū Description  Ѵ + ## If the Description is large, adjust the tooltip size. def __AdjustMaxWidth(self, attrSlot, desc): newToolTipWidth = self.toolTipWidth newToolTipWidth = max(self.__AdjustAttrMaxWidth(attrSlot), newToolTipWidth) @@ -1759,9 +1759,9 @@ class ItemToolTip(ToolTip): def AppendRealTimeStartFirstUseLastTime(self, item, metinSlot, limitIndex): useCount = metinSlot[1] endTime = metinSlot[0] - - # ̶ ߴٸ Socket0 ð(2012 3 1 13 01 ..) . - # ʾҴٸ Socket0 ̿밡ɽð(̸׸ 600 . ʴ) ְ, 0̶ Limit Value ִ ̿밡ɽð Ѵ. + + # If it has been used even once, Socket0 will have an end time (such as 13:01 on March 1, 2012). + # If it has not been used, Socket0 may have an available time (such as 600, in seconds). If it is 0, the available time in the Limit Value is used. if 0 == useCount: if 0 == endTime: (limitType, limitValue) = item.GetLimit(limitIndex) @@ -2110,7 +2110,7 @@ class SkillToolTip(ToolTip): if skillLevel < skillMaxLevelEnd: if self.HasSkillLevelDescription(skillIndex, skillLevel+skillLevelUpPoint): self.AppendSpace(5) - ## HP, ȸ ų + ## In case of HP reinforcement, penetration evasion auxiliary skills if skillIndex == 141 or skillIndex == 142: self.AppendTextLine(localeInfo.TOOLTIP_NEXT_SKILL_LEVEL_3 % (skillLevel+1), self.DISABLE_COLOR) else: