Merge pull request #22 from rtw1x1/main
QoL; Translated Korean comments in English
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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가 셋팅되기 때문에,
|
||||
# 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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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=캐릭터 선택 인덱스 (없거나 -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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: #상점풍선을 안보이게 감추는 경우에도, 플레이어 자신의 상점 풍선은 보이도록 함. 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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
# 아이템 툴팁을 표시할 때 현재 캐릭터가 착용할 수 없는 아이템이라면 강제로 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:
|
||||
|
||||
Reference in New Issue
Block a user