forked from metin2/client
1
0
Fork 0
client/bin_original/uiDragonSoul.py

1314 lines
47 KiB
Python

import ui
import player
import mouseModule
import net
import app
import snd
import item
import chat
import grp
import uiScriptLocale
import uiRefine
import uiAttachMetin
import uiPickMoney
import uiCommon
import uiPrivateShopBuilder
import locale
import constInfo
import ime
import uiInventory
import sys
ITEM_FLAG_APPLICABLE = 1 << 14
# 용혼석 Vnum에 대한 comment
# ITEM VNUM을 10만 자리부터, FEDCBA라고 한다면
# FE : 용혼석 종류. D : 등급
# C : 단계 B : 강화
# A : 여벌의 번호들...
class DragonSoulWindow(ui.ScriptWindow):
KIND_TAP_TITLES = [uiScriptLocale.DRAGONSOUL_TAP_TITLE_1, uiScriptLocale.DRAGONSOUL_TAP_TITLE_2,
uiScriptLocale.DRAGONSOUL_TAP_TITLE_3, uiScriptLocale.DRAGONSOUL_TAP_TITLE_4, uiScriptLocale.DRAGONSOUL_TAP_TITLE_5, uiScriptLocale.DRAGONSOUL_TAP_TITLE_6]
def __init__(self):
ui.ScriptWindow.__init__(self)
self.questionDialog = None
self.tooltipItem = None
self.sellingSlotNumber = -1
self.isLoaded = 0
self.isActivated = FALSE
self.DSKindIndex = 0
self.tabDict = None
self.tabButtonDict = None
self.deckPageIndex = 0
self.inventoryPageIndex = 0
self.SetWindowName("DragonSoulWindow")
self.__LoadWindow()
def __del__(self):
ui.ScriptWindow.__del__(self)
def Show(self):
self.__LoadWindow()
ui.ScriptWindow.Show(self)
def __LoadWindow(self):
if self.isLoaded == 1:
return
self.isLoaded = 1
try:
pyScrLoader = ui.PythonScriptLoader()
pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulwindow.py")
except:
import exception
exception.Abort("dragonsoulwindow.LoadWindow.LoadObject")
try:
if locale.IsARABIC():
self.board = self.GetChild("Equipment_Base")
self.board.SetScale(-1.0, 1.0)
self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
self.board = self.GetChild("Tab_01")
self.board.SetScale(-1.0, 1.0)
self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
self.board = self.GetChild("Tab_02")
self.board.SetScale(-1.0, 1.0)
self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
self.board = self.GetChild("Tab_03")
self.board.SetScale(-1.0, 1.0)
self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
self.board = self.GetChild("Tab_04")
self.board.SetScale(-1.0, 1.0)
self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
self.board = self.GetChild("Tab_05")
self.board.SetScale(-1.0, 1.0)
self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
self.board = self.GetChild("Tab_06")
self.board.SetScale(-1.0, 1.0)
self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
wndItem = self.GetChild("ItemSlot")
wndEquip = self.GetChild("EquipmentSlot")
self.activateButton = self.GetChild("activate")
self.deckTab = []
self.deckTab.append(self.GetChild("deck1"))
self.deckTab.append(self.GetChild("deck2"))
self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))
self.inventoryTab = []
self.inventoryTab.append(self.GetChild("Inventory_Tab_01"))
self.inventoryTab.append(self.GetChild("Inventory_Tab_02"))
self.inventoryTab.append(self.GetChild("Inventory_Tab_03"))
self.inventoryTab.append(self.GetChild("Inventory_Tab_04"))
self.inventoryTab.append(self.GetChild("Inventory_Tab_05"))
self.tabDict = {
0 : self.GetChild("Tab_01"),
1 : self.GetChild("Tab_02"),
2 : self.GetChild("Tab_03"),
3 : self.GetChild("Tab_04"),
4 : self.GetChild("Tab_05"),
5 : self.GetChild("Tab_06"),
}
self.tabButtonDict = {
0 : self.GetChild("Tab_Button_01"),
1 : self.GetChild("Tab_Button_02"),
2 : self.GetChild("Tab_Button_03"),
3 : self.GetChild("Tab_Button_04"),
4 : self.GetChild("Tab_Button_05"),
5 : self.GetChild("Tab_Button_06"),
}
self.tabText = self.GetChild("tab_text_area")
except:
import exception
exception.Abort("InventoryWindow.LoadWindow.BindObject")
## DragonSoul Kind Tap
for (tabKey, tabButton) in self.tabButtonDict.items():
tabButton.SetEvent(ui.__mem_func__(self.SetDSKindIndex), tabKey)
## Item
wndItem.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))
wndItem.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))
wndItem.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectItemSlot))
wndItem.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptySlot))
wndItem.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseItemSlot))
wndItem.SetUseSlotEvent(ui.__mem_func__(self.UseItemSlot))
## Equipment
wndEquip.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptyEquipSlot))
wndEquip.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectEquipItemSlot))
wndEquip.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseEquipItemSlot))
wndEquip.SetUseSlotEvent(ui.__mem_func__(self.UseEquipItemSlot))
wndEquip.SetOverInItemEvent(ui.__mem_func__(self.OverInEquipItem))
wndEquip.SetOverOutItemEvent(ui.__mem_func__(self.OverOutEquipItem))
## Deck
self.deckTab[0].SetToggleDownEvent(lambda arg=0: self.SetDeckPage(arg))
self.deckTab[1].SetToggleDownEvent(lambda arg=1: self.SetDeckPage(arg))
self.deckTab[0].SetToggleUpEvent(lambda arg=0: self.__DeckButtonDown(arg))
self.deckTab[1].SetToggleUpEvent(lambda arg=1: self.__DeckButtonDown(arg))
self.deckTab[0].Down()
## Grade button
self.inventoryTab[0].SetEvent(lambda arg=0: self.SetInventoryPage(arg))
self.inventoryTab[1].SetEvent(lambda arg=1: self.SetInventoryPage(arg))
self.inventoryTab[2].SetEvent(lambda arg=2: self.SetInventoryPage(arg))
self.inventoryTab[3].SetEvent(lambda arg=3: self.SetInventoryPage(arg))
self.inventoryTab[4].SetEvent(lambda arg=4: self.SetInventoryPage(arg))
self.inventoryTab[0].Down()
## Etc
self.wndItem = wndItem
self.wndEquip = wndEquip
self.dlgQuestion = uiCommon.QuestionDialog2()
self.dlgQuestion.Close()
self.activateButton.SetToggleDownEvent(ui.__mem_func__(self.ActivateButtonClick))
self.activateButton.SetToggleUpEvent(ui.__mem_func__(self.ActivateButtonClick))
self.wndPopupDialog = uiCommon.PopupDialog()
##
self.listHighlightedSlot = []
## Refresh
self.SetInventoryPage(0)
self.RefreshItemSlot()
self.RefreshEquipSlotWindow()
self.RefreshBagSlotWindow()
self.SetDSKindIndex(0)
self.activateButton.Enable()
self.deckTab[self.deckPageIndex].Down()
self.activateButton.SetUp()
def Destroy(self):
self.ClearDictionary()
self.tooltipItem = None
self.wndItem = 0
self.wndEquip = 0
self.activateButton = 0
self.questionDialog = None
self.mallButton = None
self.inventoryTab = []
self.deckTab = []
self.equipmentTab = []
self.tabDict = None
self.tabButtonDict = None
def Close(self):
if None != self.tooltipItem:
self.tooltipItem.HideToolTip()
self.Hide()
def __DeckButtonDown(self, deck):
self.deckTab[deck].Down()
def SetInventoryPage(self, page):
if self.inventoryPageIndex != page:
self.__HighlightSlot_ClearCurrentPage()
self.inventoryPageIndex = page
self.inventoryTab[(page+1)%5].SetUp()
self.inventoryTab[(page+2)%5].SetUp()
self.inventoryTab[(page+3)%5].SetUp()
self.inventoryTab[(page+4)%5].SetUp()
self.RefreshBagSlotWindow()
def SetItemToolTip(self, tooltipItem):
self.tooltipItem = tooltipItem
def RefreshItemSlot(self):
self.RefreshBagSlotWindow()
self.RefreshEquipSlotWindow()
def RefreshEquipSlotWindow(self):
for i in xrange(6):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
itemVnum = player.GetItemIndex(slotNumber)
self.wndEquip.SetItemSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i, itemVnum, 0)
self.wndEquip.EnableSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
if itemVnum != 0:
item.SelectItem(itemVnum)
for j in xrange(item.LIMIT_MAX_NUM):
(limitType, limitValue) = item.GetLimit(j)
# 밑에서 remain_time이 0이하인지 체크 하기 때문에 임의의 양수로 초기화
remain_time = 999
# 일단 현재 타이머는 이 세개 뿐이다.
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:
remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp()
elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)
if remain_time <= 0:
self.wndEquip.DisableSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
break
self.wndEquip.RefreshSlot()
def RefreshStatus(self):
self.RefreshItemSlot()
def __InventoryLocalSlotPosToGlobalSlotPos(self, window_type, local_slot_pos):
if player.INVENTORY == window_type:
return self.deckPageIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE + local_slot_pos
return (self.DSKindIndex * 5 * player.DRAGON_SOUL_PAGE_SIZE) + self.inventoryPageIndex * player.DRAGON_SOUL_PAGE_SIZE + local_slot_pos
def RefreshBagSlotWindow(self):
getItemVNum=player.GetItemIndex
getItemCount=player.GetItemCount
setItemVnum=self.wndItem.SetItemSlot
for i in xrange(player.DRAGON_SOUL_PAGE_SIZE):
self.wndItem.EnableSlot(i)
#<- dragon soul kind
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)
itemCount = getItemCount(player.DRAGON_SOUL_INVENTORY, slotNumber)
if 0 == itemCount:
self.wndItem.ClearSlot(i)
continue
elif 1 == itemCount:
itemCount = 0
itemVnum = getItemVNum(player.DRAGON_SOUL_INVENTORY, slotNumber)
setItemVnum(i, itemVnum, itemCount)
if itemVnum != 0:
item.SelectItem(itemVnum)
for j in xrange(item.LIMIT_MAX_NUM):
(limitType, limitValue) = item.GetLimit(j)
# 밑에서 remain_time이 음수인지 체크 하기 때문에 임의의 양수로 초기화
remain_time = 999
if item.LIMIT_REAL_TIME == limitType:
remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)
elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:
remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)
elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)
if remain_time <= 0:
self.wndItem.DisableSlot(i)
break
self.__HighlightSlot_RefreshCurrentPage()
self.wndItem.RefreshSlot()
def ShowToolTip(self, window_type, slotIndex):
if None != self.tooltipItem:
if player.INVENTORY == window_type:
self.tooltipItem.SetInventoryItem(slotIndex)
else:
self.tooltipItem.SetInventoryItem(slotIndex, player.DRAGON_SOUL_INVENTORY)
def OnPressEscapeKey(self):
self.Close()
return TRUE
def OnTop(self):
if None != self.tooltipItem:
self.tooltipItem.SetTop()
# item slot 관련 함수
def OverOutItem(self):
self.wndItem.SetUsableItem(FALSE)
if None != self.tooltipItem:
self.tooltipItem.HideToolTip()
def OverInItem(self, overSlotPos):
self.wndItem.DeactivateSlot(overSlotPos)
overSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, overSlotPos)
try:
self.listHighlightedSlot.remove(overSlotPos)
except:
pass
self.wndItem.SetUsableItem(FALSE)
self.ShowToolTip(player.DRAGON_SOUL_INVENTORY, overSlotPos)
def __UseItem(self, slotIndex):
ItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, slotIndex)
if 0 == player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotIndex, 0):
self.wndPopupDialog.SetText(locale.DRAGON_SOUL_EXPIRED)
self.wndPopupDialog.Open()
return
self.__EquipItem(slotIndex)
def __EquipItem(self, slotIndex):
ItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, slotIndex)
item.SelectItem(ItemVNum)
subType = item.GetItemSubType()
equipSlotPos = player.DRAGON_SOUL_EQUIPMENT_SLOT_START + self.deckPageIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE + subType
srcItemPos = (player.DRAGON_SOUL_INVENTORY, slotIndex)
dstItemPos = (player.INVENTORY, equipSlotPos)
self.__OpenQuestionDialog(TRUE, srcItemPos, dstItemPos)
def SelectItemSlot(self, itemSlotIndex):
if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:
return
itemSlotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)
if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
attachedItemVID = mouseModule.mouseController.GetAttachedItemIndex()
attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
if player.RESERVED_WINDOW != attachedInvenType:
net.SendItemUseToItemPacket(attachedInvenType, attachedSlotPos, player.DRAGON_SOUL_INVENTORY, itemSlotIndex)
mouseModule.mouseController.DeattachObject()
else:
selectedItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)
itemCount = player.GetItemCount(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)
mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)
self.wndItem.SetUseMode(FALSE)
snd.PlaySound("sound/ui/pick.wav")
def SelectEmptySlot(self, selectedSlotPos):
if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:
return
selectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, selectedSlotPos)
print "__debug", selectedSlotPos
if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
if player.SLOT_TYPE_PRIVATE_SHOP == attachedSlotType:
mouseModule.mouseController.RunCallBack("INVENTORY")
elif player.SLOT_TYPE_SHOP == attachedSlotType:
net.SendShopBuyPacket(attachedSlotPos)
elif player.SLOT_TYPE_SAFEBOX == attachedSlotType:
if player.ITEM_MONEY == attachedItemIndex:
net.SendSafeboxWithdrawMoneyPacket(mouseModule.mouseController.GetAttachedItemCount())
snd.PlaySound("sound/ui/money.wav")
else:
net.SendSafeboxCheckoutPacket(attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos)
elif player.SLOT_TYPE_MALL == attachedSlotType:
net.SendMallCheckoutPacket(attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos)
elif player.RESERVED_WINDOW != attachedInvenType:
if player.IsDSEquipmentSlot(attachedInvenType, attachedSlotPos):
srcItemPos = (attachedInvenType, attachedSlotPos)
dstItemPos = (player.DRAGON_SOUL_INVENTORY, selectedSlotPos)
self.__OpenQuestionDialog(FALSE, srcItemPos, dstItemPos)
else:
itemCount = player.GetItemCount(attachedInvenType, attachedSlotPos)
attachedCount = mouseModule.mouseController.GetAttachedItemCount()
self.__SendMoveItemPacket(attachedInvenType, attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos, attachedCount)
mouseModule.mouseController.DeattachObject()
def UseItemSlot(self, slotIndex):
if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS():
return
slotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, slotIndex)
try:
# 용혼석 강화창이 열려있으면, 아이템 우클릭 시 자동으로 강화창으로 들어감.
if self.wndDragonSoulRefine.IsShow():
if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
return
self.wndDragonSoulRefine.AutoSetItem((player.DRAGON_SOUL_INVENTORY, slotIndex), 1)
return
except:
pass
self.__UseItem(slotIndex)
mouseModule.mouseController.DeattachObject()
self.OverOutItem()
def __SendMoveItemPacket(self, srcSlotWindow, srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount):
if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
return
net.SendItemMovePacket(srcSlotWindow , srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount)
# equip 슬롯 관련 함수들.
def OverOutEquipItem(self):
self.OverOutItem()
def OverInEquipItem(self, overSlotPos):
overSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, overSlotPos)
self.wndItem.SetUsableItem(FALSE)
self.ShowToolTip(player.INVENTORY, overSlotPos)
def UseEquipItemSlot(self, slotIndex):
if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS():
return
slotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, slotIndex)
self.__UseEquipItem(slotIndex)
mouseModule.mouseController.DeattachObject()
self.OverOutEquipItem()
def __UseEquipItem(self, slotIndex):
if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, locale.USE_ITEM_FAILURE_PRIVATE_SHOP)
return
self.__OpenQuestionDialog(FALSE, (player.INVENTORY, slotIndex), (1, 1))
def SelectEquipItemSlot(self, itemSlotIndex):
if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:
return
itemSlotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, itemSlotIndex)
if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
# 자기 자신을 자기 자신에게 드래그하는 경우
if player.SLOT_TYPE_INVENTORY == attachedSlotType and itemSlotIndex == attachedSlotPos:
return
attachedItemVID = mouseModule.mouseController.GetAttachedItemIndex()
attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
if player.RESERVED_WINDOW != attachedInvenType:
net.SendItemUseToItemPacket(attachedInvenType, attachedSlotPos, player.INVENTORY, itemSlotIndex)
mouseModule.mouseController.DeattachObject()
else:
selectedItemVNum = player.GetItemIndex(player.INVENTORY, itemSlotIndex)
itemCount = player.GetItemCount(player.INVENTORY, itemSlotIndex)
mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)
self.wndItem.SetUseMode(FALSE)
snd.PlaySound("sound/ui/pick.wav")
def SelectEmptyEquipSlot(self, selectedSlot):
if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:
return
selectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, selectedSlot)
if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
if player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedSlotType:
if 0 == player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, attachedSlotPos, 0):
self.wndPopupDialog.SetText(locale.DRAGON_SOUL_EXPIRED)
self.wndPopupDialog.Open()
return
item.SelectItem(attachedItemIndex)
subType = item.GetItemSubType()
if subType != (selectedSlot - player.DRAGON_SOUL_EQUIPMENT_SLOT_START):
self.wndPopupDialog.SetText(locale.DRAGON_SOUL_UNMATCHED_SLOT)
self.wndPopupDialog.Open()
else:
srcItemPos = (player.DRAGON_SOUL_INVENTORY, attachedSlotPos)
dstItemPos = (player.INVENTORY, selectedSlotPos)
self.__OpenQuestionDialog(TRUE, srcItemPos, dstItemPos)
mouseModule.mouseController.DeattachObject()
# equip 슬롯 관련 함수들 끝.
# 경고창 관련
def __OpenQuestionDialog(self, Equip, srcItemPos, dstItemPos):
self.srcItemPos = srcItemPos
self.dstItemPos = dstItemPos
self.dlgQuestion.SetAcceptEvent(ui.__mem_func__(self.__Accept))
self.dlgQuestion.SetCancelEvent(ui.__mem_func__(self.__Cancel))
if Equip:
self.dlgQuestion.SetText1(locale.DRAGON_SOUL_EQUIP_WARNING1)
self.dlgQuestion.SetText2(locale.DRAGON_SOUL_EQUIP_WARNING2)
else:
self.dlgQuestion.SetText1(locale.DRAGON_SOUL_UNEQUIP_WARNING1)
self.dlgQuestion.SetText2(locale.DRAGON_SOUL_UNEQUIP_WARNING2)
self.dlgQuestion.Open()
def __Accept(self):
if (-1, -1) == self.dstItemPos:
net.SendItemUsePacket(*srcItemPos)
else:
self.__SendMoveItemPacket(*(self.srcItemPos + self.dstItemPos + (0,)))
self.dlgQuestion.Close()
def __Cancel(self):
self.srcItemPos = (0, 0)
self.dstItemPos = (0, 0)
self.dlgQuestion.Close()
# 경고창 관련 끝
def SetDSKindIndex(self, kindIndex):
if self.DSKindIndex != kindIndex:
self.__HighlightSlot_ClearCurrentPage()
self.DSKindIndex = kindIndex
for (tabKey, tabButton) in self.tabButtonDict.items():
if kindIndex!=tabKey:
tabButton.SetUp()
for tabValue in self.tabDict.itervalues():
tabValue.Hide()
self.tabDict[kindIndex].Show()
self.tabText.SetText(DragonSoulWindow.KIND_TAP_TITLES[kindIndex])
self.RefreshBagSlotWindow()
def SetDeckPage(self, page):
if page == self.deckPageIndex:
return
if self.isActivated:
self.DeactivateDragonSoul()
net.SendChatPacket("/dragon_soul deactivate")
self.deckPageIndex = page
self.deckTab[page].Down()
self.deckTab[(page+1)%2].SetUp()
self.RefreshEquipSlotWindow()
# 용혼석 활성화 관련
def ActivateDragonSoulByExtern(self, deck):
self.isActivated = TRUE
self.activateButton.Down()
self.deckPageIndex = deck
self.deckTab[deck].Down()
self.deckTab[(deck+1)%2].SetUp()
self.RefreshEquipSlotWindow()
def DeactivateDragonSoul(self):
self.isActivated = FALSE
self.activateButton.SetUp()
def ActivateButtonClick(self):
self.isActivated = self.isActivated ^ TRUE
if self.isActivated:
if self.__CanActivateDeck():
net.SendChatPacket("/dragon_soul activate " + str(self.deckPageIndex))
else:
self.isActivated = FALSE
self.activateButton.SetUp()
else:
net.SendChatPacket("/dragon_soul deactivate")
def __CanActivateDeck(self):
canActiveNum = 0
for i in xrange(6):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
itemVnum = player.GetItemIndex(slotNumber)
if itemVnum != 0:
item.SelectItem(itemVnum)
isNoLimit = TRUE
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는 서버에 제대로 정의되지 않아 일단 냅둔다.
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할 수 있는 용혼석.
if isNoLimit:
canActiveNum += 1
return canActiveNum > 0
# 활성화 관련 끝
# 슬롯 highlight 관련
def __HighlightSlot_ClearCurrentPage(self):
for i in xrange(self.wndItem.GetSlotCount()):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)
if slotNumber in self.listHighlightedSlot:
self.wndItem.DeactivateSlot(i)
self.listHighlightedSlot.remove(slotNumber)
def __HighlightSlot_RefreshCurrentPage(self):
for i in xrange(self.wndItem.GetSlotCount()):
slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)
if slotNumber in self.listHighlightedSlot:
self.wndItem.ActivateSlot(i)
def HighlightSlot(self, slot):
if not slot in self.listHighlightedSlot:
self.listHighlightedSlot.append (slot)
# 슬롯 highlight 관련 끝
def SetDragonSoulRefineWindow(self, wndDragonSoulRefine):
if app.ENABLE_DRAGON_SOUL_SYSTEM:
from _weakref import proxy
self.wndDragonSoulRefine = proxy(wndDragonSoulRefine)
## 강화할 수 없는 경우 날리는 예외
#class DragonSoulRefineException(Exception):
#pass
class DragonSoulRefineWindow(ui.ScriptWindow):
REFINE_TYPE_GRADE, REFINE_TYPE_STEP, REFINE_TYPE_STRENGTH = xrange(3)
DS_SUB_HEADER_DIC = {
REFINE_TYPE_GRADE : player.DS_SUB_HEADER_DO_UPGRADE,
REFINE_TYPE_STEP : player.DS_SUB_HEADER_DO_IMPROVEMENT,
REFINE_TYPE_STRENGTH : player.DS_SUB_HEADER_DO_REFINE
}
REFINE_STONE_SLOT, DRAGON_SOUL_SLOT = xrange(2)
INVALID_DRAGON_SOUL_INFO = -1
def __init__(self):
ui.ScriptWindow.__init__(self)
self.tooltipItem = None
self.sellingSlotNumber = -1
self.isLoaded = 0
self.refineChoiceButtonDict = None
self.doRefineButton = None
self.wndMoney = None
self.SetWindowName("DragonSoulRefineWindow")
self.__LoadWindow()
def __del__(self):
ui.ScriptWindow.__del__(self)
def Show(self):
self.__LoadWindow()
ui.ScriptWindow.Show(self)
def __LoadWindow(self):
if self.isLoaded == 1:
return
self.isLoaded = 1
try:
pyScrLoader = ui.PythonScriptLoader()
pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulrefinewindow.py")
except:
import exception
exception.Abort("dragonsoulrefinewindow.LoadWindow.LoadObject")
try:
if locale.IsARABIC():
self.board = self.GetChild("DragonSoulRefineWindowBaseImage")
self.board.SetScale(-1.0, 1.0)
self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
wndRefineSlot = self.GetChild("RefineSlot")
wndResultSlot = self.GetChild("ResultSlot")
self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))
self.refineChoiceButtonDict = {
self.REFINE_TYPE_GRADE : self.GetChild("GradeButton"),
self.REFINE_TYPE_STEP: self.GetChild("StepButton"),
self.REFINE_TYPE_STRENGTH : self.GetChild("StrengthButton"),
}
self.doRefineButton = self.GetChild("DoRefineButton")
self.wndMoney = self.GetChild("Money_Slot")
except:
import exception
exception.Abort("DragonSoulRefineWindow.LoadWindow.BindObject")
## Item Slots
wndRefineSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInRefineItem))
wndRefineSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))
wndRefineSlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.__SelectRefineEmptySlot))
wndRefineSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))
wndRefineSlot.SetUseSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))
wndRefineSlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))
wndResultSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInResultItem))
wndResultSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))
self.wndRefineSlot = wndRefineSlot
self.wndResultSlot = wndResultSlot
## Button
self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleDownEvent(self.__ToggleDownGradeButton)
self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleDownEvent(self.__ToggleDownStepButton)
self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleDownEvent(self.__ToggleDownStrengthButton)
self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_GRADE))
self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STEP))
self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STRENGTH))
self.doRefineButton.SetEvent(self.__PressDoRefineButton)
## Dialog
self.wndPopupDialog = uiCommon.PopupDialog()
self.currentRefineType = self.REFINE_TYPE_GRADE
self.refineItemInfo = {}
self.resultItemInfo = {}
self.currentRecipe = {}
self.wndMoney.SetText(locale.NumberToMoneyString(0))
self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()
self.__Initialize()
def Destroy(self):
self.ClearDictionary()
self.tooltipItem = None
self.wndItem = 0
self.wndEquip = 0
self.activateButton = 0
self.questionDialog = None
self.mallButton = None
self.inventoryTab = []
self.deckTab = []
self.equipmentTab = []
self.tabDict = None
self.tabButtonDict = None
def Close(self):
if None != self.tooltipItem:
self.tooltipItem.HideToolTip()
self.__FlushRefineItemSlot()
player.SendDragonSoulRefine(player.DRAGON_SOUL_REFINE_CLOSE)
self.Hide()
def Show(self):
self.currentRefineType = self.REFINE_TYPE_GRADE
self.wndMoney.SetText(locale.NumberToMoneyString(0))
self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()
self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetUp()
self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetUp()
self.Refresh()
ui.ScriptWindow.Show(self)
def SetItemToolTip(self, tooltipItem):
self.tooltipItem = tooltipItem
# 버튼 눌려 있는 상태를 제외한 모든 강화창 관련 변수들을 초기화.
def __Initialize(self):
self.currentRecipe = {}
self.refineItemInfo = {}
self.resultItemInfo = {}
if self.REFINE_TYPE_STRENGTH == self.currentRefineType:
self.refineSlotLockStartIndex = 2
else:
self.refineSlotLockStartIndex = 1
for i in xrange(self.refineSlotLockStartIndex):
self.wndRefineSlot.HideSlotBaseImage(i)
self.wndMoney.SetText(locale.NumberToMoneyString(0))
def __FlushRefineItemSlot(self):
## Item slot settings
# 원래 인벤의 아이템 카운트 회복
for invenType, invenPos, itemCount in self.refineItemInfo.values():
remainCount = player.GetItemCount(invenType, invenPos)
player.SetItemCount(invenType, invenPos, remainCount + itemCount)
self.__Initialize()
def __ToggleUpButton(self, idx):
#if self.REFINE_TYPE_GRADE == self.currentRefineType:
self.refineChoiceButtonDict[idx].Down()
def __ToggleDownGradeButton(self):
if self.REFINE_TYPE_GRADE == self.currentRefineType:
return
self.refineChoiceButtonDict[self.currentRefineType].SetUp()
self.currentRefineType = self.REFINE_TYPE_GRADE
self.__FlushRefineItemSlot()
self.Refresh()
def __ToggleDownStepButton(self):
if self.REFINE_TYPE_STEP == self.currentRefineType:
return
self.refineChoiceButtonDict[self.currentRefineType].SetUp()
self.currentRefineType = self.REFINE_TYPE_STEP
self.__FlushRefineItemSlot()
self.Refresh()
def __ToggleDownStrengthButton(self):
if self.REFINE_TYPE_STRENGTH == self.currentRefineType:
return
self.refineChoiceButtonDict[self.currentRefineType].SetUp()
self.currentRefineType = self.REFINE_TYPE_STRENGTH
self.__FlushRefineItemSlot()
self.Refresh()
def __PopUp(self, message):
self.wndPopupDialog.SetText(message)
self.wndPopupDialog.Open()
def __SetItem(self, (invenType, invenPos), dstSlotIndex, itemCount):
if dstSlotIndex >= self.refineSlotLockStartIndex:
return FALSE
itemVnum = player.GetItemIndex(invenType, invenPos)
maxCount = player.GetItemCount(invenType, invenPos)
if itemCount > maxCount:
raise Exception, ("Invalid attachedItemCount(%d). (base pos (%d, %d), base itemCount(%d))" % (itemCount, invenType, invenPos, maxCount))
#return FALSE
# strength 강화일 경우, 0번엔 강화석, 1번엔 용혼석을 놓도록 강제함.
if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:
if self.__IsDragonSoul(itemVnum):
dstSlotIndex = 1
else:
dstSlotIndex = 0
# 빈 슬롯이어야함.
if dstSlotIndex in self.refineItemInfo:
return FALSE
# 강화창에 올릴 수 있는 아이템인지 검사.
if FALSE == self.__CheckCanRefine(itemVnum):
return FALSE
# 끌어다 놓은 아이템 카운트만큼 원래 자리의 아이템 카운트 감소
player.SetItemCount(invenType, invenPos, maxCount - itemCount)
self.refineItemInfo[dstSlotIndex] = (invenType, invenPos, itemCount)
self.Refresh()
return TRUE
# 강화 가능한 아이템인지 체크
# 용혼석 강화는 강화 레시피를 정해놓고 시작하는 것이 아니라,
# 처음에 강화창에 올린 용혼석에 의해 강화 레시피가 결정된다.
# 그래서 __CanRefineGrade, __CanRefineStep, __CanRefineStrength 함수에서
# 강화 레시피가 없다면(처음 올리는 아이템이라면), 강화 레시피를 설정해주는 역할도 한다.
def __CheckCanRefine(self, vnum):
if self.REFINE_TYPE_GRADE == self.currentRefineType:
return self.__CanRefineGrade(vnum)
elif self.REFINE_TYPE_STEP == self.currentRefineType:
return self.__CanRefineStep(vnum)
elif self.REFINE_TYPE_STRENGTH == self.currentRefineType:
return self.__CanRefineStrength(vnum)
else:
return FALSE
return TRUE
def __CanRefineGrade (self, vnum):
ds_info = self.__GetDragonSoulTypeInfo(vnum)
if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:
self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)
return FALSE
if self.currentRecipe:
ds_type, grade, step, strength = ds_info
cur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]
if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade):
self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)
return FALSE
# 강화 창에 처음 아이템을 올리는 경우, 강화 재료에 관한 정보가 없다.
# 용혼석 강화가, 레시피를 가지고 시작하는 것이 아니라, 강화창에 처음 올리는 아이템이 무엇이냐에 따라,
# 무엇을 강화하고, 재료가 무엇인지(이하 레시피)가 정해진다.
# 레시피가 없다면, 처음 올린 아이템이라 생각하고, vnum을 바탕으로 레시피를 셋팅.
else:
self.currentRecipe = self.__GetRefineGradeRecipe(vnum)
if self.currentRecipe:
self.refineSlotLockStartIndex = self.currentRecipe["need_count"]
self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))
return TRUE
else:
# 강화 정보 셋팅에 실패하면 올릴 수 없는 아이템으로 판단.
self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)
return FALSE
def __CanRefineStep (self, vnum):
ds_info = self.__GetDragonSoulTypeInfo(vnum)
if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:
self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)
return FALSE
if self.currentRecipe:
ds_type, grade, step, strength = ds_info
cur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]
if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade and cur_refine_step == step):
self.__PopUp(locale.DRAGON_SOUL_INVALID_DRAGON_SOUL)
return FALSE
# 강화 창에 처음 아이템을 올리는 경우, 재료에 관한 정보가 없다.
# 용혼석 강화가, 레시피를 가지고 시작하는 것이 아니라, 강화창에 처음 올리는 아이템이 무엇이냐에 따라,
# 무엇을 강화하고, 재료가 무엇인지(이하 레시피)가 정해진다.
# 레시피가 없다면, 처음 올린 아이템이라 생각하고, vnum을 바탕으로 레시피를 셋팅.
else:
self.currentRecipe = self.__GetRefineStepRecipe(vnum)
if self.currentRecipe:
self.refineSlotLockStartIndex = self.currentRecipe["need_count"]
self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))
return TRUE
else:
# 강화 정보 셋팅에 실패하면 올릴 수 없는 아이템으로 판단.
self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE)
return FALSE
def __CanRefineStrength (self, vnum):
# 용혼석인 경우, 더 이상 strength 강화를 할 수 없는지 체크해야함.
if self.__IsDragonSoul(vnum):
ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)
import dragon_soul_refine_settings
if strength >= dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["strength_max_table"][grade][step]:
self.__PopUp(locale.DRAGON_SOUL_CANNOT_REFINE_MORE)
return FALSE
else:
return TRUE
# strength 강화의 경우, refine_recipe가 용혼석의 종류가 아닌, 강화석의 종류에 따라 달라진다.
# 따라서 용혼석이 아니라면,
# 이미 레시피가 있는 경우는, 강화석이 강화창에 있다는 것이므로, return FALSE
# 레시피가 없는 경우는, 강화석인지 확인하고, 레시피를 셋팅한다.
else:
if self.currentRecipe:
self.__PopUp(locale.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)
return FALSE
else:
refineRecipe = self.__GetRefineStrengthInfo(vnum)
if refineRecipe:
self.currentRecipe = refineRecipe
self.wndMoney.SetText(locale.NumberToMoneyString(self.currentRecipe["fee"]))
return TRUE
else:
# 레시피를 셋팅할 수 없는 경우
self.__PopUp(locale.DRAGON_SOUL_NOT_DRAGON_SOUL_REFINE_STONE)
return FALSE
def __GetRefineGradeRecipe (self, vnum):
ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)
try:
import dragon_soul_refine_settings
return {
"ds_info" : (ds_type, grade, step, strength),
"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_need_count"][grade],
"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_fee"][grade]
}
except:
return None
def __GetRefineStepRecipe (self, vnum):
ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)
try:
import dragon_soul_refine_settings
return {
"ds_info" : (ds_type, grade, step, strength),
"need_count" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_need_count"][step],
"fee" : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_fee"][step]
}
except:
return None
# strength 강화의 경우, refineInfo는 강화석에 따라 달라진다.
def __GetRefineStrengthInfo (self, itemVnum):
try:
# 이놈의 위치를 어찌하지....
# 강화석이 아니면 안됨.
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)):
return None
import dragon_soul_refine_settings
return { "fee" : dragon_soul_refine_settings.strength_fee[item.GetItemSubType()] }
except:
return None
def __IsDragonSoul(self, vnum):
item.SelectItem(vnum)
return item.GetItemType() == item.ITEM_TYPE_DS
# 용혼석 Vnum에 대한 comment
# ITEM VNUM을 10만 자리부터, FEDCBA라고 한다면
# FE : 용혼석 종류. D : 등급
# C : 단계 B : 강화
# A : 여벌의 번호들...
def __GetDragonSoulTypeInfo(self, vnum):
if not self.__IsDragonSoul(vnum):
return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO
ds_type = vnum / 10000
grade = vnum % 10000 /1000
step = vnum % 1000 / 100
strength = vnum % 100 / 10
return (ds_type, grade, step, strength)
def __MakeDragonSoulVnum(self, ds_type, grade, step, strength):
return ds_type * 10000 + grade * 1000 + step * 100 + strength * 10
## 빈 슬롯 선택 Event
def __SelectRefineEmptySlot(self, selectedSlotPos):
try:
if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:
return
if selectedSlotPos >= self.refineSlotLockStartIndex:
return
if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
mouseModule.mouseController.DeattachObject()
if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, locale.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
return
attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):
return
if player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:
return
if TRUE == self.__SetItem((attachedInvenType, attachedSlotPos), selectedSlotPos, attachedItemCount):
self.Refresh()
except Exception, e:
import dbg
dbg.TraceError("Exception : __SelectRefineEmptySlot, %s" % e)
# 클릭으로 슬롯에서 삭제.
def __SelectRefineItemSlot(self, selectedSlotPos):
if constInfo.GET_ITEM_DROP_QUESTION_DIALOG_STATUS() == 1:
return
try:
if not selectedSlotPos in self.refineItemInfo:
# 새로운 아이템을 강화창에 올리는 작업.
if mouseModule.mouseController.isAttached():
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
mouseModule.mouseController.DeattachObject()
if uiPrivateShopBuilder.IsBuildingPrivateShop():
chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
return
attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):
return
if player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:
return
self.AutoSetItem((attachedInvenType, attachedSlotPos), 1)
return
elif mouseModule.mouseController.isAttached():
return
attachedInvenType, attachedSlotPos, attachedItemCount = self.refineItemInfo[selectedSlotPos]
selectedItemVnum = player.GetItemIndex(attachedInvenType, attachedSlotPos)
# 강화창에서 삭제 및 원래 인벤의 아이템 카운트 회복
invenType, invenPos, itemCount = self.refineItemInfo[selectedSlotPos]
remainCount = player.GetItemCount(invenType, invenPos)
player.SetItemCount(invenType, invenPos, remainCount + itemCount)
del self.refineItemInfo[selectedSlotPos]
# 강화창이 비었다면, 초기화
if not self.refineItemInfo:
self.__Initialize()
else:
item.SelectItem(selectedItemVnum)
# 없앤 아이템이 강화석이었다면 강화 레피시 초기화
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강화의 경우, 강화 레시피는 강화석에 종속된 것이므로 다른 처리할 필요가 없음.
else:
pass
except Exception, e:
import dbg
dbg.TraceError("Exception : __SelectRefineItemSlot, %s" % e)
self.Refresh()
def __OverInRefineItem(self, slotIndex):
if self.refineItemInfo.has_key(slotIndex):
inven_type, inven_pos, item_count = self.refineItemInfo[slotIndex]
self.tooltipItem.SetInventoryItem(inven_pos, inven_type)
def __OverInResultItem(self, slotIndex):
if self.resultItemInfo.has_key(slotIndex):
inven_type, inven_pos, item_count = self.resultItemInfo[slotIndex]
self.tooltipItem.SetInventoryItem(inven_pos, inven_type)
def __OverOutItem(self):
if self.tooltipItem:
self.tooltipItem.HideToolTip()
def __PressDoRefineButton(self):
for i in xrange(self.refineSlotLockStartIndex):
if not i in self.refineItemInfo:
self.wndPopupDialog.SetText(locale.DRAGON_SOUL_NOT_ENOUGH_MATERIAL)
self.wndPopupDialog.Open()
return
player.SendDragonSoulRefine(DragonSoulRefineWindow.DS_SUB_HEADER_DIC[self.currentRefineType], self.refineItemInfo)
def OnPressEscapeKey(self):
self.Close()
return TRUE
def Refresh(self):
self.__RefreshRefineItemSlot()
self.__ClearResultItemSlot()
def __RefreshRefineItemSlot(self):
try:
for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):
self.wndRefineSlot.ClearSlot(slotPos)
if slotPos < self.refineSlotLockStartIndex:
# self.refineItemInfo[slotPos]의 정보확인
# (실제로 아이템이 존재하는지 확인)
# 존재 -> 아이템 아이콘을 슬롯에 셋팅.
# 비존재 -> 아이템이 없으므로 강화창에서 삭제.
if slotPos in self.refineItemInfo:
invenType, invenPos, itemCount = self.refineItemInfo[slotPos]
itemVnum = player.GetItemIndex(invenType, invenPos)
# if itemVnum:
if itemVnum:
self.wndRefineSlot.SetItemSlot(slotPos, player.GetItemIndex(invenType, invenPos), itemCount)
else:
del self.refineItemInfo[slotPos]
# 빈 슬롯에 reference 아이콘을 alpha 0.5로 셋팅.
if not slotPos in self.refineItemInfo:
try:
reference_vnum = 0
# strength 강화일 때는,
# 0번 슬롯에 강화석을, 1번 슬롯에 용혼석을 놓는다.
if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:
if DragonSoulRefineWindow.REFINE_STONE_SLOT == slotPos:
reference_vnum = 100300
else:
reference_vnum = self.__MakeDragonSoulVnum(*self.currentRecipe["ds_info"])
if 0 != reference_vnum:
item.SelectItem(reference_vnum)
itemIcon = item.GetIconImage()
(width, height) = item.GetItemSize()
self.wndRefineSlot.SetSlot(slotPos, 0, width, height, itemIcon, (1.0, 1.0, 1.0, 0.5))
# slot 우측 하단에 숫자 뜨면 안 예쁨...
self.wndRefineSlot.SetSlotCount(slotPos, 0)
except:
pass
# refineSlotLockStartIndex 보다 작은 슬롯은 닫힌 이미지를 보여주면 안됨.
self.wndRefineSlot.HideSlotBaseImage(slotPos)
# slotPos >= self.refineSlotLockStartIndex:
else:
# 정상적인 경우라면 이 if문에 들어갈 일은 없겠지만,
# (애초에 인덱스가 refineSlotLockStartIndex 이상인 슬롯에는 아이템을 넣지 못하게 했기 때문)
# 혹시 모를 에러에 대비함.
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[selectedSlotPos]
# refineSlotLockStartIndex 이상인 슬롯은 닫힌 이미지를 보여줘야함.
self.wndRefineSlot.ShowSlotBaseImage(slotPos)
# 강화창에 아무런 아이템이 없다면, 초기화해줌.
# 위에서 중간 중간에 "del self.refineItemInfo[slotPos]"를 했기 때문에,
# 여기서 한번 체크해줘야함.
if not self.refineItemInfo:
self.__Initialize()
self.wndRefineSlot.RefreshSlot()
except Exception, e:
import dbg
dbg.TraceError("Exception : __RefreshRefineItemSlot, %s" % e)
def __GetEmptySlot(self, itemVnum = 0):
# STRENGTH 강화의 경우, 용혼석 슬롯과 강화석 슬롯이 구분되어있기 떄문에
# vnum을 알아야 한다.
if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:
if 0 == itemVnum:
return -1
if self.__IsDragonSoul(itemVnum):
if not DragonSoulRefineWindow.DRAGON_SOUL_SLOT in self.refineItemInfo:
return DragonSoulRefineWindow.DRAGON_SOUL_SLOT
else:
if not DragonSoulRefineWindow.REFINE_STONE_SLOT in self.refineItemInfo:
return DragonSoulRefineWindow.REFINE_STONE_SLOT
else:
for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):
if not slotPos in self.refineItemInfo:
return slotPos
return -1
def AutoSetItem(self, (invenType, invenPos), itemCount):
itemVnum = player.GetItemIndex(invenType, invenPos)
emptySlot = self.__GetEmptySlot(itemVnum)
if -1 == emptySlot:
return
self.__SetItem((invenType, invenPos), emptySlot, itemCount)
def __ClearResultItemSlot(self):
self.wndResultSlot.ClearSlot(0)
self.resultItemInfo = {}
def RefineSucceed(self, inven_type, inven_pos):
self.__Initialize()
self.Refresh()
itemCount = player.GetItemCount(inven_type, inven_pos)
if itemCount > 0:
self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)
self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)
def RefineFail(self, reason, inven_type, inven_pos):
if net.DS_SUB_HEADER_REFINE_FAIL == reason:
self.__Initialize()
self.Refresh()
itemCount = player.GetItemCount(inven_type, inven_pos)
if itemCount > 0:
self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)
self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)
else:
self.Refresh()
def SetInventoryWindows(self, wndInventory, wndDragonSoul):
self.wndInventory = wndInventory
self.wndDragonSoul = wndDragonSoul