Merge pull request #22 from rtw1x1/main

QoL; Translated Korean comments in English
This commit is contained in:
rtw1x1
2025-12-27 21:51:29 +00:00
committed by GitHub
20 changed files with 377 additions and 378 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -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)

View File

@@ -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")

View File

@@ -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()

View File

@@ -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:

View File

@@ -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]

View File

@@ -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):

View File

@@ -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)

View File

@@ -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("201234만 1234냥")
priceSlot.SetText("2,012,341,234 Yang")
## Temporary
def SelectPage(self, arg):

View File

@@ -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)

View File

@@ -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")

View File

@@ -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

View File

@@ -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")
"""

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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:

View File

@@ -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: