SHARE
TWEET

Untitled

a guest Aug 25th, 2019 113 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import ui
  2. import player
  3. import mouseModule
  4. import net
  5. import app
  6. import snd
  7. import item
  8. import chat
  9. import grp
  10. import uiScriptLocale
  11. import uiRefine
  12. import uiAttachMetin
  13. import uiPickMoney
  14. import uiCommon
  15. import uiPrivateShopBuilder
  16. import localeInfo
  17. import constInfo
  18. import ime
  19. import uiInventory
  20. import sys
  21. ITEM_FLAG_APPLICABLE = 1 << 14
  22.  
  23. # 용혼석 Vnum에 대한 comment 
  24. # ITEM VNUM을 10만 자리부터, FEDCBA라고 한다면
  25. # FE : 용혼석 종류.    D : 등급
  26. # C : 단계            B : 강화     
  27. # A : 여벌의 번호들...   
  28.  
  29. class DragonSoulWindow(ui.ScriptWindow):
  30.     KIND_TAP_TITLES = [uiScriptLocale.DRAGONSOUL_TAP_TITLE_1, uiScriptLocale.DRAGONSOUL_TAP_TITLE_2,
  31.             uiScriptLocale.DRAGONSOUL_TAP_TITLE_3, uiScriptLocale.DRAGONSOUL_TAP_TITLE_4, uiScriptLocale.DRAGONSOUL_TAP_TITLE_5, uiScriptLocale.DRAGONSOUL_TAP_TITLE_6]
  32.     def __init__(self):
  33.         ui.ScriptWindow.__init__(self)
  34.         self.questionDialog = None
  35.         self.tooltipItem = None
  36.         self.sellingSlotNumber = -1
  37.         self.isLoaded = 0
  38.         self.isActivated = False
  39.         self.DSKindIndex = 0
  40.         self.tabDict = None
  41.         self.tabButtonDict = None
  42.         self.deckPageIndex = 0
  43.         self.inventoryPageIndex = 0
  44.         self.SetWindowName("DragonSoulWindow")
  45.         self.__LoadWindow()
  46.  
  47.     def __del__(self):
  48.         ui.ScriptWindow.__del__(self)
  49.        
  50.     def Show(self):
  51.         self.__LoadWindow()
  52.  
  53.         ui.ScriptWindow.Show(self)
  54.     def __LoadWindow(self):
  55.         if self.isLoaded == 1:
  56.             return
  57.         self.isLoaded = 1
  58.         try:
  59.             pyScrLoader = ui.PythonScriptLoader()          
  60.             pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulwindow.py")
  61.        
  62.         except:
  63.             import exception
  64.             exception.Abort("dragonsoulwindow.LoadWindow.LoadObject")
  65.         try:
  66.             if localeInfo.IsARABIC():
  67.                 self.board = self.GetChild("Equipment_Base")
  68.                 self.board.SetScale(-1.0, 1.0)
  69.                 self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
  70.                 self.board = self.GetChild("Tab_01")
  71.                 self.board.SetScale(-1.0, 1.0)
  72.                 self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
  73.                 self.board = self.GetChild("Tab_02")
  74.                 self.board.SetScale(-1.0, 1.0)
  75.                 self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
  76.                 self.board = self.GetChild("Tab_03")
  77.                 self.board.SetScale(-1.0, 1.0)
  78.                 self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
  79.                 self.board = self.GetChild("Tab_04")
  80.                 self.board.SetScale(-1.0, 1.0)
  81.                 self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
  82.                 self.board = self.GetChild("Tab_05")
  83.                 self.board.SetScale(-1.0, 1.0)
  84.                 self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
  85.                 self.board = self.GetChild("Tab_06")
  86.                 self.board.SetScale(-1.0, 1.0)
  87.                 self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
  88.                
  89.             wndItem = self.GetChild("ItemSlot")
  90.             wndEquip = self.GetChild("EquipmentSlot")
  91.             self.activateButton = self.GetChild("activate")
  92.             self.deckTab = []
  93.             self.deckTab.append(self.GetChild("deck1"))
  94.             self.deckTab.append(self.GetChild("deck2"))
  95.             self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))           
  96.             self.inventoryTab = []
  97.             self.inventoryTab.append(self.GetChild("Inventory_Tab_01"))
  98.             self.inventoryTab.append(self.GetChild("Inventory_Tab_02"))
  99.             self.inventoryTab.append(self.GetChild("Inventory_Tab_03"))
  100.             self.inventoryTab.append(self.GetChild("Inventory_Tab_04"))
  101.             self.inventoryTab.append(self.GetChild("Inventory_Tab_05"))
  102.             self.tabDict = {
  103.                 0   : self.GetChild("Tab_01"),
  104.                 1   : self.GetChild("Tab_02"),
  105.                 2   : self.GetChild("Tab_03"),
  106.                 3   : self.GetChild("Tab_04"),
  107.                 4   : self.GetChild("Tab_05"),
  108.                 5   : self.GetChild("Tab_06"),
  109.             }
  110.             self.tabButtonDict = {
  111.                 0   : self.GetChild("Tab_Button_01"),
  112.                 1   : self.GetChild("Tab_Button_02"),
  113.                 2   : self.GetChild("Tab_Button_03"),
  114.                 3   : self.GetChild("Tab_Button_04"),
  115.                 4   : self.GetChild("Tab_Button_05"),
  116.                 5   : self.GetChild("Tab_Button_06"),
  117.             }
  118.             self.tabText = self.GetChild("tab_text_area")
  119.         except:
  120.             import exception
  121.                     exception.Abort("InventoryWindow.LoadWindow.BindObject")
  122.                     DragonSoul Kind Tap
  123.         for (tabKey, tabButton) in self.tabButtonDict.items():
  124.             tabButton.SetEvent(ui.__mem_func__(self.SetDSKindIndex), tabKey)
  125.         ## Item
  126.         wndItem.SetOverInItemEvent(ui.__mem_func__(self.OverInItem))
  127.         wndItem.SetOverOutItemEvent(ui.__mem_func__(self.OverOutItem))
  128.         wndItem.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectItemSlot))
  129.         wndItem.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptySlot))
  130.         wndItem.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseItemSlot))
  131.         wndItem.SetUseSlotEvent(ui.__mem_func__(self.UseItemSlot))
  132.        
  133.         ## Equipment
  134.         wndEquip.SetSelectEmptySlotEvent(ui.__mem_func__(self.SelectEmptyEquipSlot))
  135.         wndEquip.SetSelectItemSlotEvent(ui.__mem_func__(self.SelectEquipItemSlot))
  136.         wndEquip.SetUnselectItemSlotEvent(ui.__mem_func__(self.UseEquipItemSlot))
  137.         wndEquip.SetUseSlotEvent(ui.__mem_func__(self.UseEquipItemSlot))
  138.         wndEquip.SetOverInItemEvent(ui.__mem_func__(self.OverInEquipItem))
  139.         wndEquip.SetOverOutItemEvent(ui.__mem_func__(self.OverOutEquipItem))
  140.        
  141.         ## Deck
  142.         self.deckTab[0].SetToggleDownEvent(lambda arg=0: self.SetDeckPage(arg))
  143.         self.deckTab[1].SetToggleDownEvent(lambda arg=1: self.SetDeckPage(arg))
  144.         self.deckTab[0].SetToggleUpEvent(lambda arg=0: self.__DeckButtonDown(arg))
  145.         self.deckTab[1].SetToggleUpEvent(lambda arg=1: self.__DeckButtonDown(arg))
  146.         self.deckTab[0].Down()
  147.         ## Grade button
  148.         self.inventoryTab[0].SetEvent(lambda arg=0: self.SetInventoryPage(arg))
  149.         self.inventoryTab[1].SetEvent(lambda arg=1: self.SetInventoryPage(arg))
  150.         self.inventoryTab[2].SetEvent(lambda arg=2: self.SetInventoryPage(arg))
  151.         self.inventoryTab[3].SetEvent(lambda arg=3: self.SetInventoryPage(arg))
  152.         self.inventoryTab[4].SetEvent(lambda arg=4: self.SetInventoryPage(arg))
  153.         self.inventoryTab[0].Down()
  154.         ## Etc
  155.         self.wndItem = wndItem
  156.         self.wndEquip = wndEquip
  157.        
  158.         self.dlgQuestion = uiCommon.QuestionDialog2()
  159.         self.dlgQuestion.Close()
  160.        
  161.         self.activateButton.SetToggleDownEvent(ui.__mem_func__(self.ActivateButtonClick))
  162.         self.activateButton.SetToggleUpEvent(ui.__mem_func__(self.ActivateButtonClick))
  163.         self.wndPopupDialog = uiCommon.PopupDialog()
  164.        
  165.         ##
  166.         self.listHighlightedSlot = []
  167.        
  168.         ## Refresh
  169.         self.SetInventoryPage(0)
  170.         self.RefreshItemSlot()
  171.         self.RefreshEquipSlotWindow()
  172.         self.RefreshBagSlotWindow()
  173.         self.SetDSKindIndex(0)
  174.         self.activateButton.Enable()
  175.         self.deckTab[self.deckPageIndex].Down()
  176.         self.activateButton.SetUp()
  177.  
  178.     def Destroy(self):
  179.         self.ClearDictionary()
  180.         self.tooltipItem = None
  181.         self.wndItem = 0
  182.         self.wndEquip = 0
  183.         self.activateButton = 0
  184.         self.questionDialog = None
  185.         self.mallButton = None
  186.         self.inventoryTab = []
  187.         self.deckTab = []
  188.         self.equipmentTab = []
  189.         self.tabDict = None
  190.         self.tabButtonDict = None
  191.        
  192.     def Close(self):
  193.         if None != self.tooltipItem:
  194.             self.tooltipItem.HideToolTip()
  195.         self.Hide()
  196.    
  197.     def __DeckButtonDown(self, deck):
  198.         self.deckTab[deck].Down()
  199.    
  200.     def SetInventoryPage(self, page):
  201.         if self.inventoryPageIndex != page:
  202.             self.__HighlightSlot_ClearCurrentPage()
  203.         self.inventoryPageIndex = page
  204.         self.inventoryTab[(page+1)%5].SetUp()
  205.         self.inventoryTab[(page+2)%5].SetUp()
  206.         self.inventoryTab[(page+3)%5].SetUp()
  207.         self.inventoryTab[(page+4)%5].SetUp()
  208.         self.RefreshBagSlotWindow()
  209.        
  210.     def SetItemToolTip(self, tooltipItem):
  211.         self.tooltipItem = tooltipItem
  212.        
  213.     def RefreshItemSlot(self):
  214.         self.RefreshBagSlotWindow()
  215.         self.RefreshEquipSlotWindow()
  216.        
  217.     def RefreshEquipSlotWindow(self):
  218.         for i in xrange(6):
  219.             slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
  220.             itemVnum = player.GetItemIndex(slotNumber)
  221.             self.wndEquip.SetItemSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i, itemVnum, 0)
  222.             self.wndEquip.EnableSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
  223.            
  224.             if itemVnum != 0:
  225.                 item.SelectItem(itemVnum)
  226.                 for j in xrange(item.LIMIT_MAX_NUM):
  227.                     (limitType, limitValue) = item.GetLimit(j)
  228.                    
  229.                     # 밑에서 remain_time이 0이하인지 체크 하기 때문에 임의의 양수로 초기화
  230.                     remain_time = 999
  231.                     # 일단 현재 타이머는 이 세개 뿐이다.
  232.                     if item.LIMIT_REAL_TIME == limitType:
  233.                         remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp()
  234.                     elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:
  235.                         remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0) - app.GetGlobalTimeStamp()
  236.                     elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
  237.                         remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)
  238.                        
  239.                     if remain_time <= 0:
  240.                         self.wndEquip.DisableSlot(player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
  241.                         break
  242.                    
  243.         self.wndEquip.RefreshSlot()
  244.        
  245.     def RefreshStatus(self):
  246.         self.RefreshItemSlot()
  247.        
  248.     def __InventoryLocalSlotPosToGlobalSlotPos(self, window_type, local_slot_pos):
  249.         if player.INVENTORY == window_type:
  250.             return self.deckPageIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE + local_slot_pos
  251.            
  252.         return (self.DSKindIndex * 5 * player.DRAGON_SOUL_PAGE_SIZE) + self.inventoryPageIndex * player.DRAGON_SOUL_PAGE_SIZE + local_slot_pos
  253.        
  254.     def RefreshBagSlotWindow(self):
  255.         getItemVNum=player.GetItemIndex
  256.         getItemCount=player.GetItemCount
  257.         setItemVnum=self.wndItem.SetItemSlot
  258.         for i in xrange(player.DRAGON_SOUL_PAGE_SIZE):
  259.             self.wndItem.EnableSlot(i)
  260.             #<- dragon soul kind
  261.             slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)
  262.  
  263.             itemCount = getItemCount(player.DRAGON_SOUL_INVENTORY, slotNumber)
  264.             if 0 == itemCount:
  265.                 self.wndItem.ClearSlot(i)
  266.                 continue
  267.             elif 1 == itemCount:
  268.                 itemCount = 0
  269.             itemVnum = getItemVNum(player.DRAGON_SOUL_INVENTORY, slotNumber)
  270.  
  271.             setItemVnum(i, itemVnum, itemCount)
  272.  
  273.             if itemVnum != 0:
  274.                 item.SelectItem(itemVnum)
  275.                 for j in xrange(item.LIMIT_MAX_NUM):
  276.                     (limitType, limitValue) = item.GetLimit(j)
  277.  
  278.                     # 밑에서 remain_time이 음수인지 체크 하기 때문에 임의의 양수로 초기화
  279.                     remain_time = 999
  280.                     if item.LIMIT_REAL_TIME == limitType:
  281.                         remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)
  282.                     elif item.LIMIT_REAL_TIME_START_FIRST_USE == limitType:
  283.                         remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)
  284.                     elif item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
  285.                         remain_time = player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotNumber, 0)
  286.                
  287.                     if remain_time <= 0:
  288.                         self.wndItem.DisableSlot(i)
  289.                         break
  290.  
  291.         self.__HighlightSlot_RefreshCurrentPage()
  292.         self.wndItem.RefreshSlot()
  293.        
  294.     def ShowToolTip(self, window_type, slotIndex):
  295.         if None != self.tooltipItem:
  296.             if player.INVENTORY == window_type:
  297.                 self.tooltipItem.SetInventoryItem(slotIndex)
  298.             else:
  299.                 self.tooltipItem.SetInventoryItem(slotIndex, player.DRAGON_SOUL_INVENTORY)
  300.  
  301.     def OnPressEscapeKey(self):
  302.         self.Close()
  303.         return True
  304.            
  305.     def OnTop(self):
  306.         if None != self.tooltipItem:
  307.             self.tooltipItem.SetTop()
  308.    
  309.     # item slot 관련 함수              
  310.     def OverOutItem(self):
  311.         self.wndItem.SetUsableItem(False)
  312.         if None != self.tooltipItem:
  313.             self.tooltipItem.HideToolTip()
  314.            
  315.     def OverInItem(self, overSlotPos):
  316.         self.wndItem.DeactivateSlot(overSlotPos)
  317.         overSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, overSlotPos)
  318.         try:
  319.             self.listHighlightedSlot.remove(overSlotPos)
  320.         except:
  321.             pass
  322.        
  323.         self.wndItem.SetUsableItem(False)
  324.         self.ShowToolTip(player.DRAGON_SOUL_INVENTORY, overSlotPos)
  325.    
  326.     def __UseItem(self, slotIndex):
  327.         ItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, slotIndex)
  328.         if 0 == player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, slotIndex, 0):
  329.             self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_EXPIRED)
  330.             self.wndPopupDialog.Open()
  331.             return
  332.  
  333.         self.__EquipItem(slotIndex)
  334.  
  335.     def __EquipItem(self, slotIndex):  
  336.         ItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, slotIndex)
  337.         item.SelectItem(ItemVNum)
  338.         subType = item.GetItemSubType()
  339.         equipSlotPos = player.DRAGON_SOUL_EQUIPMENT_SLOT_START + self.deckPageIndex * player.DRAGON_SOUL_EQUIPMENT_FIRST_SIZE + subType
  340.         srcItemPos = (player.DRAGON_SOUL_INVENTORY, slotIndex)
  341.         dstItemPos = (player.INVENTORY, equipSlotPos)
  342.         self.__OpenQuestionDialog(True, srcItemPos, dstItemPos)
  343.    
  344.     def SelectItemSlot(self, itemSlotIndex):
  345.         if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1:
  346.             return
  347.  
  348.         itemSlotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)
  349.  
  350.         if mouseModule.mouseController.isAttached():
  351.             attachedSlotType = mouseModule.mouseController.GetAttachedType()
  352.             attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
  353.             attachedItemVID = mouseModule.mouseController.GetAttachedItemIndex()
  354.                
  355.             attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
  356.             if player.RESERVED_WINDOW != attachedInvenType:
  357.                 net.SendItemUseToItemPacket(attachedInvenType, attachedSlotPos, player.DRAGON_SOUL_INVENTORY, itemSlotIndex)
  358.  
  359.             mouseModule.mouseController.DeattachObject()
  360.  
  361.         else:
  362.             ## 상점에서 팔도록 추가
  363.             ## 20140220
  364.             curCursorNum = app.GetCursor()
  365.  
  366.             if app.SELL == curCursorNum:
  367.                 self.__SellItem(itemSlotIndex)
  368.             elif app.BUY == curCursorNum:
  369.                 chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SHOP_BUY_INFO)
  370.             else:
  371.                 selectedItemVNum = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)
  372.                 itemCount = player.GetItemCount(player.DRAGON_SOUL_INVENTORY, itemSlotIndex)
  373.                 mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)
  374.                 self.wndItem.SetUseMode(False)
  375.                 snd.PlaySound("sound/ui/pick.wav")
  376.    
  377.     ## 상점에 팔기
  378.     ## 2014.02.20 추가
  379.     def __SellItem(self, itemSlotPos):
  380.         if not player.IsDSEquipmentSlot(player.DRAGON_SOUL_INVENTORY, itemSlotPos):
  381.             self.sellingSlotNumber = itemSlotPos
  382.             itemIndex = player.GetItemIndex(player.DRAGON_SOUL_INVENTORY, itemSlotPos)
  383.             itemCount = player.GetItemCount(player.DRAGON_SOUL_INVENTORY, itemSlotPos)
  384.  
  385.             item.SelectItem(itemIndex)
  386.            
  387.             if item.IsAntiFlag(item.ANTIFLAG_SELL):
  388.                 popup = uiCommon.PopupDialog()
  389.                 popup.SetText(localeInfo.SHOP_CANNOT_SELL_ITEM)
  390.                 popup.SetAcceptEvent(self.__OnClosePopupDialog)
  391.                 popup.Open()
  392.                 self.popup = popup
  393.                 return
  394.            
  395.             itemPrice = item.GetISellItemPrice()
  396.  
  397.             if item.Is1GoldItem():
  398.                 itemPrice = itemCount / itemPrice / 5
  399.             else:
  400.                 itemPrice = itemPrice * itemCount / 5
  401.  
  402.             item.GetItemName(itemIndex)
  403.             itemName = item.GetItemName()
  404.  
  405.             self.questionDialog = uiCommon.QuestionDialog()
  406.             self.questionDialog.SetText(localeInfo.DO_YOU_SELL_ITEM(itemName, itemCount, itemPrice))
  407.             self.questionDialog.SetAcceptEvent(ui.__mem_func__(self.SellItem))
  408.             self.questionDialog.SetCancelEvent(ui.__mem_func__(self.OnCloseQuestionDialog))
  409.             self.questionDialog.Open()
  410.             self.questionDialog.count = itemCount
  411.  
  412.     ## 상점에 팔기
  413.     def SellItem(self):
  414.  
  415.         net.SendShopSellPacketNew(self.sellingSlotNumber, self.questionDialog.count, player.DRAGON_SOUL_INVENTORY)
  416.         snd.PlaySound("sound/ui/money.wav")
  417.         self.OnCloseQuestionDialog()
  418.  
  419.     ## 상점에 팔기
  420.     def OnCloseQuestionDialog(self):
  421.         if self.questionDialog:
  422.             self.questionDialog.Close()
  423.  
  424.         self.questionDialog = None
  425.  
  426.     ## 상점에 팔기
  427.     def __OnClosePopupDialog(self):
  428.         self.pop = None
  429.  
  430.     def SelectEmptySlot(self, selectedSlotPos):
  431.         if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1:
  432.             return
  433.  
  434.         selectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, selectedSlotPos)
  435.         if mouseModule.mouseController.isAttached():
  436.  
  437.             attachedSlotType = mouseModule.mouseController.GetAttachedType()
  438.             attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
  439.             attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
  440.             attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
  441.  
  442.             attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
  443.             if player.SLOT_TYPE_PRIVATE_SHOP == attachedSlotType:
  444.                 mouseModule.mouseController.RunCallBack("INVENTORY")
  445.  
  446.             elif player.SLOT_TYPE_SHOP == attachedSlotType:
  447.                 net.SendShopBuyPacket(attachedSlotPos)
  448.  
  449.             elif player.SLOT_TYPE_SAFEBOX == attachedSlotType:
  450.                 if player.ITEM_MONEY == attachedItemIndex:
  451.                     net.SendSafeboxWithdrawMoneyPacket(mouseModule.mouseController.GetAttachedItemCount())
  452.                     snd.PlaySound("sound/ui/money.wav")
  453.  
  454.                 else:
  455.                     net.SendSafeboxCheckoutPacket(attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos)
  456.  
  457.             elif player.SLOT_TYPE_MALL == attachedSlotType:
  458.                 net.SendMallCheckoutPacket(attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos)
  459.  
  460.             elif player.RESERVED_WINDOW != attachedInvenType:
  461.                 if player.IsDSEquipmentSlot(attachedInvenType, attachedSlotPos):
  462.                     srcItemPos = (attachedInvenType, attachedSlotPos)
  463.                     dstItemPos = (player.DRAGON_SOUL_INVENTORY, selectedSlotPos)
  464.                     self.__OpenQuestionDialog(False, srcItemPos, dstItemPos)
  465.                 else:
  466.                     itemCount = player.GetItemCount(attachedInvenType, attachedSlotPos)
  467.                     attachedCount = mouseModule.mouseController.GetAttachedItemCount()
  468.  
  469.                     self.__SendMoveItemPacket(attachedInvenType, attachedSlotPos, player.DRAGON_SOUL_INVENTORY, selectedSlotPos, attachedCount)
  470.  
  471.             mouseModule.mouseController.DeattachObject()
  472.  
  473.     def UseItemSlot(self, slotIndex):
  474.         if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS():
  475.             return
  476.         slotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, slotIndex)
  477.         try:
  478.             # 용혼석 강화창이 열려있으면, 아이템 우클릭 시 자동으로 강화창으로 들어감.
  479.             if self.wndDragonSoulRefine.IsShow():
  480.                 if uiPrivateShopBuilder.IsBuildingPrivateShop():
  481.                     chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
  482.                     return
  483.                 self.wndDragonSoulRefine.AutoSetItem((player.DRAGON_SOUL_INVENTORY, slotIndex), 1)
  484.                 return
  485.         except:
  486.             pass
  487.  
  488.         self.__UseItem(slotIndex)
  489.  
  490.         mouseModule.mouseController.DeattachObject()
  491.         self.OverOutItem()
  492.        
  493.     def __SendMoveItemPacket(self, srcSlotWindow, srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount):
  494.         if uiPrivateShopBuilder.IsBuildingPrivateShop():
  495.             chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
  496.             return
  497.        
  498.         net.SendItemMovePacket(srcSlotWindow , srcSlotPos, dstSlotWindow, dstSlotPos, srcItemCount)
  499.    
  500.     # equip 슬롯 관련 함수들.
  501.     def OverOutEquipItem(self):
  502.         self.OverOutItem()
  503.            
  504.     def OverInEquipItem(self, overSlotPos):
  505.         overSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, overSlotPos)
  506.         self.wndItem.SetUsableItem(False)
  507.         self.ShowToolTip(player.INVENTORY, overSlotPos)
  508.    
  509.     def UseEquipItemSlot(self, slotIndex):
  510.         if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS():
  511.             return
  512.  
  513.         slotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, slotIndex)
  514.  
  515.         self.__UseEquipItem(slotIndex)
  516.         mouseModule.mouseController.DeattachObject()
  517.         self.OverOutEquipItem()
  518.    
  519.     def __UseEquipItem(self, slotIndex):
  520.         if uiPrivateShopBuilder.IsBuildingPrivateShop():
  521.             chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.USE_ITEM_FAILURE_PRIVATE_SHOP)
  522.             return
  523.  
  524.         self.__OpenQuestionDialog(False, (player.INVENTORY, slotIndex), (1, 1))
  525.                    
  526.    
  527.     def SelectEquipItemSlot(self, itemSlotIndex):
  528.  
  529.         ## 마우스 버튼이 sell buy 체크 해서 return
  530.         curCursorNum = app.GetCursor()
  531.         if app.SELL == curCursorNum:
  532.             return
  533.         elif app.BUY == curCursorNum:
  534.             chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.SHOP_BUY_INFO)
  535.             return
  536.  
  537.         if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1:
  538.             return
  539.  
  540.         itemSlotIndex = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, itemSlotIndex)
  541.  
  542.         if mouseModule.mouseController.isAttached():
  543.             attachedSlotType = mouseModule.mouseController.GetAttachedType()
  544.             attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
  545.             # 자기 자신을 자기 자신에게 드래그하는 경우
  546.             if player.SLOT_TYPE_INVENTORY == attachedSlotType and itemSlotIndex == attachedSlotPos:
  547.                 return
  548.  
  549.             attachedItemVID = mouseModule.mouseController.GetAttachedItemIndex()
  550.                
  551.             attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
  552.             if player.RESERVED_WINDOW != attachedInvenType:
  553.                 net.SendItemUseToItemPacket(attachedInvenType, attachedSlotPos, player.INVENTORY, itemSlotIndex)
  554.  
  555.             mouseModule.mouseController.DeattachObject()
  556.         else:
  557.             selectedItemVNum = player.GetItemIndex(player.INVENTORY, itemSlotIndex)
  558.             itemCount = player.GetItemCount(player.INVENTORY, itemSlotIndex)
  559.             mouseModule.mouseController.AttachObject(self, player.SLOT_TYPE_INVENTORY, itemSlotIndex, selectedItemVNum, itemCount)
  560.             self.wndItem.SetUseMode(False)
  561.             snd.PlaySound("sound/ui/pick.wav")
  562.            
  563.     def SelectEmptyEquipSlot(self, selectedSlot):
  564.         if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1:
  565.             return
  566.  
  567.         selectedSlotPos = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, selectedSlot)
  568.  
  569.         if mouseModule.mouseController.isAttached():
  570.             attachedSlotType = mouseModule.mouseController.GetAttachedType()
  571.             attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
  572.             attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
  573.             attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
  574.  
  575.             if player.SLOT_TYPE_DRAGON_SOUL_INVENTORY == attachedSlotType:
  576.                 if 0 == player.GetItemMetinSocket(player.DRAGON_SOUL_INVENTORY, attachedSlotPos, 0):
  577.                     self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_EXPIRED)
  578.                     self.wndPopupDialog.Open()
  579.                     return
  580.            
  581.                 item.SelectItem(attachedItemIndex)
  582.                 subType = item.GetItemSubType()
  583.                 if subType != (selectedSlot - player.DRAGON_SOUL_EQUIPMENT_SLOT_START):
  584.                     self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_UNMATCHED_SLOT)
  585.                     self.wndPopupDialog.Open()
  586.                 else:
  587.                     srcItemPos = (player.DRAGON_SOUL_INVENTORY, attachedSlotPos)
  588.                     dstItemPos = (player.INVENTORY, selectedSlotPos)
  589.                     self.__OpenQuestionDialog(True, srcItemPos, dstItemPos)
  590.  
  591.             mouseModule.mouseController.DeattachObject()
  592.     # equip 슬롯 관련 함수들 끝.
  593.    
  594.     # 경고창 관련
  595.     def __OpenQuestionDialog(self, Equip, srcItemPos, dstItemPos):
  596.         self.srcItemPos = srcItemPos
  597.         self.dstItemPos = dstItemPos
  598.        
  599.         self.dlgQuestion.SetAcceptEvent(ui.__mem_func__(self.__Accept))
  600.         self.dlgQuestion.SetCancelEvent(ui.__mem_func__(self.__Cancel))
  601.  
  602.         if Equip:
  603.             self.dlgQuestion.SetText1(localeInfo.DRAGON_SOUL_EQUIP_WARNING1)
  604.             self.dlgQuestion.SetText2(localeInfo.DRAGON_SOUL_EQUIP_WARNING2)
  605.         else:
  606.             self.dlgQuestion.SetText1(localeInfo.DRAGON_SOUL_UNEQUIP_WARNING1)
  607.             self.dlgQuestion.SetText2(localeInfo.DRAGON_SOUL_UNEQUIP_WARNING2)
  608.  
  609.         self.dlgQuestion.Open()
  610.        
  611.     def __Accept(self):
  612.         if (-1, -1) == self.dstItemPos:
  613.             net.SendItemUsePacket(*self.srcItemPos)
  614.         else:
  615.             self.__SendMoveItemPacket(*(self.srcItemPos + self.dstItemPos + (0,)))
  616.         self.dlgQuestion.Close()
  617.  
  618.     def __Cancel(self):
  619.         self.srcItemPos = (0, 0)
  620.         self.dstItemPos = (0, 0)
  621.         self.dlgQuestion.Close()
  622.  
  623.     # 경고창 관련 끝
  624.    
  625.     def SetDSKindIndex(self, kindIndex):
  626.         if self.DSKindIndex != kindIndex:
  627.             self.__HighlightSlot_ClearCurrentPage()
  628.        
  629.         self.DSKindIndex = kindIndex
  630.  
  631.         for (tabKey, tabButton) in self.tabButtonDict.items():
  632.             if kindIndex!=tabKey:
  633.                 tabButton.SetUp()
  634.  
  635.         for tabValue in self.tabDict.itervalues():
  636.             tabValue.Hide()
  637.  
  638.         self.tabDict[kindIndex].Show()
  639.         self.tabText.SetText(DragonSoulWindow.KIND_TAP_TITLES[kindIndex])
  640.        
  641.         self.RefreshBagSlotWindow()
  642.        
  643.     def SetDeckPage(self, page):
  644.         if page == self.deckPageIndex:
  645.             return
  646.    
  647.         if self.isActivated:
  648.             self.DeactivateDragonSoul()
  649.             net.SendChatPacket("/dragon_soul deactivate")
  650.         self.deckPageIndex = page
  651.         self.deckTab[page].Down()
  652.         self.deckTab[(page+1)%2].SetUp()
  653.        
  654.         self.RefreshEquipSlotWindow()
  655.    
  656.     # 용혼석 활성화 관련
  657.     def ActivateDragonSoulByExtern(self, deck):
  658.         self.isActivated = True
  659.         self.activateButton.Down()
  660.         self.deckPageIndex = deck
  661.         self.deckTab[deck].Down()
  662.         self.deckTab[(deck+1)%2].SetUp()
  663.         self.RefreshEquipSlotWindow()
  664.        
  665.     def DeactivateDragonSoul(self):
  666.         self.isActivated = False
  667.         self.activateButton.SetUp()
  668.  
  669.     def ActivateButtonClick(self):
  670.         self.isActivated = self.isActivated ^ True
  671.         if self.isActivated:
  672.             if self.__CanActivateDeck():
  673.                 net.SendChatPacket("/dragon_soul activate " + str(self.deckPageIndex))
  674.             else:
  675.                 self.isActivated = False
  676.                 self.activateButton.SetUp()
  677.         else:
  678.             net.SendChatPacket("/dragon_soul deactivate")
  679.  
  680.     def __CanActivateDeck(self):
  681.         canActiveNum = 0
  682.         for i in xrange(6):
  683.             slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.INVENTORY, player.DRAGON_SOUL_EQUIPMENT_SLOT_START + i)
  684.             itemVnum = player.GetItemIndex(slotNumber)
  685.            
  686.             if itemVnum != 0:
  687.                 item.SelectItem(itemVnum)
  688.                 isNoLimit = True
  689.                 for i in xrange(item.LIMIT_MAX_NUM):
  690.                     (limitType, limitValue) = item.GetLimit(i)
  691.                    
  692.                     # LIMIT_TIMER_BASED_ON_WEAR는 소켓0에 남은 시간을 박는다.
  693.                     # LIMIT_REAL_TIME은 시간 다 되면 아이템이 사라지므로 할 필요가 없다.
  694.                     # LIMIT_REAL_TIME_START_FIRST_USE는 서버에 제대로 정의되지 않아 일단 냅둔다.
  695.                     if item.LIMIT_TIMER_BASED_ON_WEAR == limitType:
  696.                         isNoLimit = False
  697.                         remain_time = player.GetItemMetinSocket(player.INVENTORY, slotNumber, 0)
  698.                         if 0 != remain_time:
  699.                             canActiveNum += 1
  700.                             break
  701.                 # 타이머가 없다면 Activate할 수 있는 용혼석.
  702.                 if isNoLimit:
  703.                     canActiveNum += 1
  704.        
  705.         return canActiveNum > 0
  706.    
  707.     # 활성화 관련 끝
  708.    
  709.     # 슬롯 highlight 관련
  710.     def __HighlightSlot_ClearCurrentPage(self):
  711.         for i in xrange(self.wndItem.GetSlotCount()):
  712.             slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)
  713.             if slotNumber in self.listHighlightedSlot:
  714.                 self.wndItem.DeactivateSlot(i)
  715.                 self.listHighlightedSlot.remove(slotNumber)
  716.    
  717.     def __HighlightSlot_RefreshCurrentPage(self):
  718.         for i in xrange(self.wndItem.GetSlotCount()):
  719.             slotNumber = self.__InventoryLocalSlotPosToGlobalSlotPos(player.DRAGON_SOUL_INVENTORY, i)
  720.             if slotNumber in self.listHighlightedSlot:
  721.                 self.wndItem.ActivateSlot(i)
  722.    
  723.     def HighlightSlot(self, slot):
  724.         if not slot in self.listHighlightedSlot:
  725.             self.listHighlightedSlot.append (slot)
  726.     # 슬롯 highlight 관련 끝
  727.    
  728.     def SetDragonSoulRefineWindow(self, wndDragonSoulRefine):
  729.         if app.ENABLE_DRAGON_SOUL_SYSTEM:
  730.             from _weakref import proxy
  731.             self.wndDragonSoulRefine = proxy(wndDragonSoulRefine)
  732.  
  733. ## 강화할 수 없는 경우 날리는 예외
  734. class DragonSoulRefineException(Exception):
  735.     #pass
  736.  
  737. class DragonSoulRefineWindow(ui.ScriptWindow):
  738.     REFINE_TYPE_GRADE, REFINE_TYPE_STEP, REFINE_TYPE_STRENGTH = xrange(3)
  739.     DS_SUB_HEADER_DIC = {
  740.         REFINE_TYPE_GRADE : player.DS_SUB_HEADER_DO_UPGRADE,
  741.         REFINE_TYPE_STEP : player.DS_SUB_HEADER_DO_IMPROVEMENT,
  742.         REFINE_TYPE_STRENGTH : player.DS_SUB_HEADER_DO_REFINE
  743.     }
  744.     REFINE_STONE_SLOT, DRAGON_SOUL_SLOT = xrange(2)
  745.  
  746.     INVALID_DRAGON_SOUL_INFO = -1
  747.    
  748.     def __init__(self):
  749.         ui.ScriptWindow.__init__(self)
  750.         self.tooltipItem = None
  751.         self.sellingSlotNumber = -1
  752.         self.isLoaded = 0
  753.         self.refineChoiceButtonDict = None
  754.         self.doRefineButton = None
  755.         self.wndMoney = None
  756.         self.SetWindowName("DragonSoulRefineWindow")
  757.         self.__LoadWindow()
  758.        
  759.     def __del__(self):
  760.         ui.ScriptWindow.__del__(self)
  761.  
  762.     def Show(self):
  763.         self.__LoadWindow()
  764.         ui.ScriptWindow.Show(self)
  765.  
  766.     def __LoadWindow(self):
  767.         if self.isLoaded == 1:
  768.             return
  769.         self.isLoaded = 1
  770.         try:
  771.             pyScrLoader = ui.PythonScriptLoader()          
  772.             pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "dragonsoulrefinewindow.py")
  773.  
  774.         except:
  775.             import exception
  776.             exception.Abort("dragonsoulrefinewindow.LoadWindow.LoadObject")
  777.         try:
  778.             if localeInfo.IsARABIC():
  779.                 self.board = self.GetChild("DragonSoulRefineWindowBaseImage")
  780.                 self.board.SetScale(-1.0, 1.0)
  781.                 self.board.SetRenderingRect(-1.0, 0.0, 1.0, 0.0)
  782.                
  783.             wndRefineSlot = self.GetChild("RefineSlot")
  784.             wndResultSlot = self.GetChild("ResultSlot")
  785.             self.GetChild("TitleBar").SetCloseEvent(ui.__mem_func__(self.Close))           
  786.             self.refineChoiceButtonDict = {
  787.                 self.REFINE_TYPE_GRADE  : self.GetChild("GradeButton"),
  788.                 self.REFINE_TYPE_STEP: self.GetChild("StepButton"),
  789.                 self.REFINE_TYPE_STRENGTH   : self.GetChild("StrengthButton"),
  790.             }
  791.             self.doRefineButton = self.GetChild("DoRefineButton")
  792.             self.wndMoney = self.GetChild("Money_Slot")
  793.        
  794.         except:
  795.             import exception
  796.             exception.Abort("DragonSoulRefineWindow.LoadWindow.BindObject")
  797.        
  798.    
  799.         ## Item Slots
  800.         wndRefineSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInRefineItem))
  801.         wndRefineSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))
  802.         wndRefineSlot.SetSelectEmptySlotEvent(ui.__mem_func__(self.__SelectRefineEmptySlot))
  803.         wndRefineSlot.SetSelectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))
  804.         wndRefineSlot.SetUseSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))
  805.         wndRefineSlot.SetUnselectItemSlotEvent(ui.__mem_func__(self.__SelectRefineItemSlot))
  806.        
  807.         wndResultSlot.SetOverInItemEvent(ui.__mem_func__(self.__OverInResultItem))
  808.         wndResultSlot.SetOverOutItemEvent(ui.__mem_func__(self.__OverOutItem))
  809.         self.wndRefineSlot = wndRefineSlot
  810.         self.wndResultSlot = wndResultSlot
  811.        
  812.         ## Button
  813.         self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleDownEvent(self.__ToggleDownGradeButton)
  814.         self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleDownEvent(self.__ToggleDownStepButton)
  815.         self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleDownEvent(self.__ToggleDownStrengthButton)
  816.         self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_GRADE))
  817.         self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STEP))
  818.         self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetToggleUpEvent(lambda : self.__ToggleUpButton(self.REFINE_TYPE_STRENGTH))
  819.         self.doRefineButton.SetEvent(self.__PressDoRefineButton)
  820.        
  821.         ## Dialog
  822.         self.wndPopupDialog = uiCommon.PopupDialog()
  823.        
  824.         self.currentRefineType = self.REFINE_TYPE_GRADE
  825.         self.refineItemInfo = {}
  826.         self.resultItemInfo = {}
  827.         self.currentRecipe = {}
  828.        
  829.         self.wndMoney.SetText(localeInfo.NumberToMoneyString(0))
  830.         self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()
  831.        
  832.         self.__Initialize()
  833.        
  834.     def Destroy(self):
  835.         self.ClearDictionary()
  836.         self.tooltipItem = None
  837.         self.wndItem = 0
  838.         self.wndEquip = 0
  839.         self.activateButton = 0
  840.         self.questionDialog = None
  841.         self.mallButton = None
  842.         self.inventoryTab = []
  843.         self.deckTab = []
  844.         self.equipmentTab = []
  845.         self.tabDict = None
  846.         self.tabButtonDict = None
  847.        
  848.     def Close(self):
  849.         if None != self.tooltipItem:
  850.             self.tooltipItem.HideToolTip()
  851.        
  852.         self.__FlushRefineItemSlot()
  853.         player.SendDragonSoulRefine(player.DRAGON_SOUL_REFINE_CLOSE)
  854.         self.Hide()
  855.  
  856.     def Show(self):
  857.         self.currentRefineType = self.REFINE_TYPE_GRADE
  858.         self.wndMoney.SetText(localeInfo.NumberToMoneyString(0))
  859.         self.refineChoiceButtonDict[self.REFINE_TYPE_GRADE].Down()
  860.         self.refineChoiceButtonDict[self.REFINE_TYPE_STEP].SetUp()
  861.         self.refineChoiceButtonDict[self.REFINE_TYPE_STRENGTH].SetUp()
  862.        
  863.         self.Refresh()
  864.        
  865.         ui.ScriptWindow.Show(self)
  866.  
  867.     def SetItemToolTip(self, tooltipItem):
  868.         self.tooltipItem = tooltipItem
  869.    
  870.     # 버튼 눌려 있는 상태를 제외한 모든 강화창 관련 변수들을 초기화.
  871.     def __Initialize(self):
  872.         self.currentRecipe = {}
  873.         self.refineItemInfo = {}
  874.         self.resultItemInfo = {}
  875.        
  876.         if self.REFINE_TYPE_STRENGTH == self.currentRefineType:
  877.             self.refineSlotLockStartIndex = 2
  878.         else:
  879.             self.refineSlotLockStartIndex = 1
  880.  
  881.         for i in xrange(self.refineSlotLockStartIndex):
  882.             self.wndRefineSlot.HideSlotBaseImage(i)
  883.  
  884.         self.wndMoney.SetText(localeInfo.NumberToMoneyString(0))
  885.  
  886.     def __FlushRefineItemSlot(self):
  887.         ## Item slot settings
  888.         # 원래 인벤의 아이템 카운트 회복
  889.         for invenType, invenPos, itemCount in self.refineItemInfo.values():
  890.             remainCount = player.GetItemCount(invenType, invenPos)
  891.             player.SetItemCount(invenType, invenPos, remainCount + itemCount)
  892.         self.__Initialize()
  893.    
  894.     def __ToggleUpButton(self, idx):
  895.         #if self.REFINE_TYPE_GRADE == self.currentRefineType:
  896.         self.refineChoiceButtonDict[idx].Down()
  897.  
  898.     def __ToggleDownGradeButton(self):
  899.         if self.REFINE_TYPE_GRADE == self.currentRefineType:
  900.             return
  901.         self.refineChoiceButtonDict[self.currentRefineType].SetUp()
  902.         self.currentRefineType = self.REFINE_TYPE_GRADE
  903.         self.__FlushRefineItemSlot()
  904.         self.Refresh()
  905.        
  906.     def __ToggleDownStepButton(self):
  907.         if self.REFINE_TYPE_STEP == self.currentRefineType:
  908.             return
  909.         self.refineChoiceButtonDict[self.currentRefineType].SetUp()
  910.         self.currentRefineType = self.REFINE_TYPE_STEP
  911.         self.__FlushRefineItemSlot()
  912.         self.Refresh()
  913.  
  914.     def __ToggleDownStrengthButton(self):
  915.         if self.REFINE_TYPE_STRENGTH == self.currentRefineType:
  916.             return
  917.         self.refineChoiceButtonDict[self.currentRefineType].SetUp()
  918.         self.currentRefineType = self.REFINE_TYPE_STRENGTH
  919.         self.__FlushRefineItemSlot()
  920.         self.Refresh()
  921.  
  922.     def __PopUp(self, message):
  923.         self.wndPopupDialog.SetText(message)
  924.         self.wndPopupDialog.Open()
  925.    
  926.     def __SetItem(self, inven, dstSlotIndex, itemCount):
  927.         invenType, invenPos = inven
  928.  
  929.         if dstSlotIndex >= self.refineSlotLockStartIndex:
  930.             return False
  931.            
  932.         itemVnum = player.GetItemIndex(invenType, invenPos)
  933.         maxCount = player.GetItemCount(invenType, invenPos)
  934.        
  935.         if itemCount > maxCount:
  936.             raise Exception, ("Invalid attachedItemCount(%d). (base pos (%d, %d), base itemCount(%d))" % (itemCount, invenType, invenPos, maxCount))
  937.             #return False
  938.        
  939.         # strength 강화일 경우, 0번엔 강화석, 1번엔 용혼석을 놓도록 강제함.
  940.         if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:
  941.             if self.__IsDragonSoul(itemVnum):
  942.                 dstSlotIndex = 1
  943.             else:
  944.                 dstSlotIndex = 0
  945.        
  946.         # 빈 슬롯이어야함.
  947.         if dstSlotIndex in self.refineItemInfo:
  948.             return False
  949.            
  950.         # 강화창에 올릴 수 있는 아이템인지 검사.
  951.         if False == self.__CheckCanRefine(itemVnum):
  952.             return False
  953.        
  954.         # 끌어다 놓은 아이템 카운트만큼 원래 자리의 아이템 카운트 감소
  955.         player.SetItemCount(invenType, invenPos, maxCount - itemCount)
  956.         self.refineItemInfo[dstSlotIndex] = (invenType, invenPos, itemCount)
  957.         self.Refresh()
  958.  
  959.         return True
  960.    
  961.     # 강화 가능한 아이템인지 체크
  962.     # 용혼석 강화는 강화 레시피를 정해놓고 시작하는 것이 아니라,
  963.     # 처음에 강화창에 올린 용혼석에 의해 강화 레시피가 결정된다.
  964.     # 그래서 __CanRefineGrade, __CanRefineStep, __CanRefineStrength 함수에서
  965.     # 강화 레시피가 없다면(처음 올리는 아이템이라면), 강화 레시피를 설정해주는 역할도 한다.
  966.     def __CheckCanRefine(self, vnum):
  967.         if self.REFINE_TYPE_GRADE == self.currentRefineType:
  968.             return self.__CanRefineGrade(vnum)
  969.  
  970.         elif self.REFINE_TYPE_STEP == self.currentRefineType:
  971.             return self.__CanRefineStep(vnum)
  972.                
  973.         elif self.REFINE_TYPE_STRENGTH == self.currentRefineType:
  974.             return self.__CanRefineStrength(vnum)
  975.                
  976.         else:
  977.             return False
  978.  
  979.     def __CanRefineGrade (self, vnum):
  980.         ds_info = self.__GetDragonSoulTypeInfo(vnum)
  981.        
  982.         if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:
  983.             self.__PopUp(localeInfo.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)
  984.             return False
  985.            
  986.         if self.currentRecipe:
  987.             ds_type, grade, step, strength = ds_info
  988.             cur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]
  989.             if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade):
  990.                 self.__PopUp(localeInfo.DRAGON_SOUL_INVALID_DRAGON_SOUL)
  991.                 return False
  992.         # 강화 창에 처음 아이템을 올리는 경우, 강화 재료에 관한 정보가 없다.
  993.         # 용혼석 강화가, 레시피를 가지고 시작하는 것이 아니라, 강화창에 처음 올리는 아이템이 무엇이냐에 따라,
  994.         # 무엇을 강화하고, 재료가 무엇인지(이하 레시피)가 정해진다.
  995.         # 레시피가 없다면, 처음 올린 아이템이라 생각하고, vnum을 바탕으로 레시피를 셋팅.
  996.         else:
  997.             self.currentRecipe = self.__GetRefineGradeRecipe(vnum)
  998.  
  999.             if self.currentRecipe:
  1000.                 self.refineSlotLockStartIndex = self.currentRecipe["need_count"]
  1001.                 self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"]))               
  1002.                 return True
  1003.             else:
  1004.             # 강화 정보 셋팅에 실패하면 올릴 수 없는 아이템으로 판단.
  1005.                 self.__PopUp(localeInfo.DRAGON_SOUL_CANNOT_REFINE)
  1006.                 return False
  1007.  
  1008.     def __CanRefineStep (self, vnum):
  1009.         ds_info = self.__GetDragonSoulTypeInfo(vnum)
  1010.        
  1011.         if DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO == ds_info:
  1012.             self.__PopUp(localeInfo.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)
  1013.             return False
  1014.        
  1015.         if self.currentRecipe:
  1016.             ds_type, grade, step, strength = ds_info
  1017.             cur_refine_ds_type, cur_refine_grade, cur_refine_step, cur_refine_strength = self.currentRecipe["ds_info"]
  1018.             if not (cur_refine_ds_type == ds_type and cur_refine_grade == grade and cur_refine_step == step):
  1019.                 self.__PopUp(localeInfo.DRAGON_SOUL_INVALID_DRAGON_SOUL)
  1020.                 return False
  1021.         # 강화 창에 처음 아이템을 올리는 경우, 재료에 관한 정보가 없다.
  1022.         # 용혼석 강화가, 레시피를 가지고 시작하는 것이 아니라, 강화창에 처음 올리는 아이템이 무엇이냐에 따라,
  1023.         # 무엇을 강화하고, 재료가 무엇인지(이하 레시피)가 정해진다.
  1024.         # 레시피가 없다면, 처음 올린 아이템이라 생각하고, vnum을 바탕으로 레시피를 셋팅.
  1025.         else:
  1026.             self.currentRecipe = self.__GetRefineStepRecipe(vnum)
  1027.  
  1028.             if self.currentRecipe:
  1029.                 self.refineSlotLockStartIndex = self.currentRecipe["need_count"]
  1030.                 self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"]))               
  1031.                 return True
  1032.  
  1033.             else:
  1034.             # 강화 정보 셋팅에 실패하면 올릴 수 없는 아이템으로 판단.
  1035.                 self.__PopUp(localeInfo.DRAGON_SOUL_CANNOT_REFINE)
  1036.                 return False
  1037.  
  1038.     def __CanRefineStrength (self, vnum):
  1039.         # 용혼석인 경우, 더 이상 strength 강화를 할 수 없는지 체크해야함.
  1040.         if self.__IsDragonSoul(vnum):
  1041.             ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)
  1042.            
  1043.             import dragon_soul_refine_settings
  1044.             if strength >= dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["strength_max_table"][grade][step]:
  1045.                 self.__PopUp(localeInfo.DRAGON_SOUL_CANNOT_REFINE_MORE)
  1046.                 return False
  1047.  
  1048.             else:
  1049.                 return True
  1050.        
  1051.         # strength 강화의 경우, refine_recipe가 용혼석의 종류가 아닌, 강화석의 종류에 따라 달라진다.
  1052.         # 따라서 용혼석이 아니라면,
  1053.         # 이미 레시피가 있는 경우는, 강화석이 강화창에 있다는 것이므로, return False
  1054.         # 레시피가 없는 경우는, 강화석인지 확인하고, 레시피를 셋팅한다.
  1055.         else:
  1056.             if self.currentRecipe:
  1057.                 self.__PopUp(localeInfo.DRAGON_SOUL_IS_NOT_DRAGON_SOUL)
  1058.                 return False
  1059.             else:
  1060.                 refineRecipe = self.__GetRefineStrengthInfo(vnum)
  1061.                 if refineRecipe:
  1062.                     self.currentRecipe = refineRecipe
  1063.                     self.wndMoney.SetText(localeInfo.NumberToMoneyString(self.currentRecipe["fee"]))
  1064.                     return True
  1065.                 else:
  1066.                 # 레시피를 셋팅할 수 없는 경우
  1067.                     self.__PopUp(localeInfo.DRAGON_SOUL_NOT_DRAGON_SOUL_REFINE_STONE)
  1068.                     return False
  1069.  
  1070.     def __GetRefineGradeRecipe (self, vnum):
  1071.         ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)
  1072.         try:
  1073.             import dragon_soul_refine_settings
  1074.  
  1075.             return  {
  1076.                 "ds_info"       : (ds_type, grade, step, strength),
  1077.                 "need_count"    : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_need_count"][grade],
  1078.                 "fee"           : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["grade_fee"][grade]
  1079.                     }
  1080.         except:
  1081.             return None
  1082.  
  1083.     def __GetRefineStepRecipe (self, vnum):
  1084.         ds_type, grade, step, strength = self.__GetDragonSoulTypeInfo(vnum)
  1085.         try:
  1086.             import dragon_soul_refine_settings
  1087.    
  1088.             return  {
  1089.                 "ds_info"       : (ds_type, grade, step, strength),
  1090.                 "need_count"    : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_need_count"][step],
  1091.                 "fee"           : dragon_soul_refine_settings.dragon_soul_refine_info[ds_type]["step_fee"][step]
  1092.                     }
  1093.         except:
  1094.             return None
  1095.        
  1096.     # strength 강화의 경우, refineInfo는 강화석에 따라 달라진다.
  1097.     def __GetRefineStrengthInfo (self, itemVnum):
  1098.         try:
  1099.             # 이놈의 위치를 어찌하지....
  1100.             # 강화석이 아니면 안됨.
  1101.             item.SelectItem(itemVnum)
  1102.             if not (item.ITEM_TYPE_MATERIAL == item.GetItemType() \
  1103.                     and (item.MATERIAL_DS_REFINE_NORMAL <= item.GetItemSubType() and item.GetItemSubType() <= item.MATERIAL_DS_REFINE_HOLLY)):
  1104.                 return None
  1105.  
  1106.             import dragon_soul_refine_settings
  1107.             return { "fee" : dragon_soul_refine_settings.strength_fee[item.GetItemSubType()] }
  1108.         except:
  1109.             return None
  1110.  
  1111.     def __IsDragonSoul(self, vnum):
  1112.         item.SelectItem(vnum)
  1113.         return item.GetItemType() == item.ITEM_TYPE_DS
  1114.        
  1115.     # 용혼석 Vnum에 대한 comment 
  1116.     # ITEM VNUM을 10만 자리부터, FEDCBA라고 한다면
  1117.     # FE : 용혼석 종류.    D : 등급
  1118.     # C : 단계            B : 강화     
  1119.     # A : 여벌의 번호들...   
  1120.     def __GetDragonSoulTypeInfo(self, vnum):
  1121.         if not self.__IsDragonSoul(vnum):
  1122.             return DragonSoulRefineWindow.INVALID_DRAGON_SOUL_INFO
  1123.         ds_type = vnum / 10000
  1124.         grade = vnum % 10000 /1000
  1125.         step = vnum % 1000 / 100
  1126.         strength = vnum % 100 / 10
  1127.        
  1128.         return (ds_type, grade, step, strength)
  1129.    
  1130.     def __MakeDragonSoulVnum(self, ds_type, grade, step, strength):
  1131.         return ds_type * 10000 + grade * 1000 + step * 100 + strength * 10
  1132.  
  1133.     ## 빈 슬롯 선택 Event
  1134.     def __SelectRefineEmptySlot(self, selectedSlotPos):
  1135.         try:
  1136.             if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1:
  1137.                 return
  1138.            
  1139.             if selectedSlotPos >= self.refineSlotLockStartIndex:
  1140.                 return
  1141.      
  1142.             if mouseModule.mouseController.isAttached():
  1143.                 attachedSlotType = mouseModule.mouseController.GetAttachedType()
  1144.                 attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
  1145.                 attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
  1146.                 attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
  1147.                 mouseModule.mouseController.DeattachObject()
  1148.  
  1149.                 if uiPrivateShopBuilder.IsBuildingPrivateShop():
  1150.                     chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
  1151.                     return
  1152.  
  1153.                 attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
  1154.  
  1155.                 if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):
  1156.                     return
  1157.  
  1158.                 if player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:
  1159.                     return
  1160.  
  1161.                 if True == self.__SetItem((attachedInvenType, attachedSlotPos), selectedSlotPos, attachedItemCount):
  1162.                     self.Refresh()
  1163.  
  1164.         except Exception, e:
  1165.             import dbg
  1166.             dbg.TraceError("Exception : __SelectRefineEmptySlot, %s" % e)
  1167.  
  1168.     # 클릭으로 슬롯에서 삭제.
  1169.     def __SelectRefineItemSlot(self, selectedSlotPos):
  1170.         if constInfo.GET_ITEM_QUESTION_DIALOG_STATUS() == 1:
  1171.             return
  1172.  
  1173.         try:
  1174.             if not selectedSlotPos in self.refineItemInfo:
  1175.                 # 새로운 아이템을 강화창에 올리는 작업.
  1176.                 if mouseModule.mouseController.isAttached():
  1177.                     attachedSlotType = mouseModule.mouseController.GetAttachedType()
  1178.                     attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
  1179.                     attachedItemCount = mouseModule.mouseController.GetAttachedItemCount()
  1180.                     attachedItemIndex = mouseModule.mouseController.GetAttachedItemIndex()
  1181.                     mouseModule.mouseController.DeattachObject()
  1182.  
  1183.                     if uiPrivateShopBuilder.IsBuildingPrivateShop():
  1184.                         chat.AppendChat(chat.CHAT_TYPE_INFO, localeInfo.MOVE_ITEM_FAILURE_PRIVATE_SHOP)
  1185.                         return
  1186.  
  1187.                     attachedInvenType = player.SlotTypeToInvenType(attachedSlotType)
  1188.  
  1189.                     if player.INVENTORY == attachedInvenType and player.IsEquipmentSlot(attachedSlotPos):
  1190.                         return
  1191.  
  1192.                     if player.INVENTORY != attachedInvenType and player.DRAGON_SOUL_INVENTORY != attachedInvenType:
  1193.                         return
  1194.  
  1195.                     self.AutoSetItem((attachedInvenType, attachedSlotPos), 1)
  1196.                 return
  1197.             elif mouseModule.mouseController.isAttached():
  1198.                 return
  1199.  
  1200.             attachedInvenType, attachedSlotPos, attachedItemCount = self.refineItemInfo[selectedSlotPos]
  1201.             selectedItemVnum = player.GetItemIndex(attachedInvenType, attachedSlotPos)
  1202.                
  1203.             # 강화창에서 삭제 및 원래 인벤의 아이템 카운트 회복
  1204.             invenType, invenPos, itemCount = self.refineItemInfo[selectedSlotPos]
  1205.             remainCount = player.GetItemCount(invenType, invenPos)
  1206.             player.SetItemCount(invenType, invenPos, remainCount + itemCount)
  1207.             del self.refineItemInfo[selectedSlotPos]
  1208.                
  1209.             # 강화창이 비었다면, 초기화
  1210.             if not self.refineItemInfo:
  1211.                 self.__Initialize()
  1212.             else:
  1213.                 item.SelectItem(selectedItemVnum)
  1214.                 # 없앤 아이템이 강화석이었다면 강화 레피시 초기화
  1215.                 if (item.ITEM_TYPE_MATERIAL == item.GetItemType() \
  1216.                     and (item.MATERIAL_DS_REFINE_NORMAL <= item.GetItemSubType() and item.GetItemSubType() <= item.MATERIAL_DS_REFINE_HOLLY)):
  1217.                     self.currentRecipe = {}
  1218.                     self.wndMoney.SetText(localeInfo.NumberToMoneyString(0))
  1219.                 # 용혼석이었다면,
  1220.                 # strength강화가 아닌 경우, 강화창에 다른 용혼석이 남아있으므로, 레시피를 초기화하면 안됨.
  1221.                 # strength강화의 경우, 강화 레시피는 강화석에 종속된 것이므로 다른 처리할 필요가 없음.
  1222.                 else:
  1223.                     pass
  1224.                    
  1225.         except Exception, e:
  1226.             import dbg
  1227.             dbg.TraceError("Exception : __SelectRefineItemSlot, %s" % e)
  1228.        
  1229.         self.Refresh()
  1230.    
  1231.     def __OverInRefineItem(self, slotIndex):
  1232.         if self.refineItemInfo.has_key(slotIndex):
  1233.             inven_type, inven_pos, item_count = self.refineItemInfo[slotIndex]
  1234.             self.tooltipItem.SetInventoryItem(inven_pos, inven_type)
  1235.  
  1236.     def __OverInResultItem(self, slotIndex):
  1237.         if self.resultItemInfo.has_key(slotIndex):
  1238.             inven_type, inven_pos, item_count = self.resultItemInfo[slotIndex]
  1239.             self.tooltipItem.SetInventoryItem(inven_pos, inven_type)
  1240.        
  1241.     def __OverOutItem(self):
  1242.         if self.tooltipItem:
  1243.             self.tooltipItem.HideToolTip()
  1244.  
  1245.     def __PressDoRefineButton(self):
  1246.         for i in xrange(self.refineSlotLockStartIndex):
  1247.             if not i in self.refineItemInfo:
  1248.                 self.wndPopupDialog.SetText(localeInfo.DRAGON_SOUL_NOT_ENOUGH_MATERIAL)
  1249.                 self.wndPopupDialog.Open()
  1250.                
  1251.                 return
  1252.  
  1253.         player.SendDragonSoulRefine(DragonSoulRefineWindow.DS_SUB_HEADER_DIC[self.currentRefineType], self.refineItemInfo)
  1254.            
  1255.     def OnPressEscapeKey(self):
  1256.         self.Close()
  1257.         return True
  1258.    
  1259.     def Refresh(self):
  1260.         self.__RefreshRefineItemSlot()
  1261.         self.__ClearResultItemSlot()
  1262.            
  1263.     def __RefreshRefineItemSlot(self):
  1264.         try:
  1265.             for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):
  1266.                 self.wndRefineSlot.ClearSlot(slotPos)
  1267.                 if slotPos < self.refineSlotLockStartIndex:
  1268.                     # self.refineItemInfo[slotPos]의 정보확인
  1269.                     # (실제로 아이템이 존재하는지 확인)
  1270.                     # 존재 -> 아이템 아이콘을 슬롯에 셋팅.
  1271.                     # 비존재 -> 아이템이 없으므로 강화창에서 삭제.
  1272.                     if slotPos in self.refineItemInfo:
  1273.                         invenType, invenPos, itemCount = self.refineItemInfo[slotPos]
  1274.                         itemVnum = player.GetItemIndex(invenType, invenPos)
  1275.  
  1276.                         # if itemVnum:
  1277.                         if itemVnum:
  1278.                             self.wndRefineSlot.SetItemSlot(slotPos, player.GetItemIndex(invenType, invenPos), itemCount)
  1279.                         else:
  1280.                             del self.refineItemInfo[slotPos]
  1281.  
  1282.                     # 빈 슬롯에 reference 아이콘을 alpha 0.5로 셋팅.
  1283.                     if not slotPos in self.refineItemInfo:
  1284.                         try:
  1285.                             reference_vnum = 0
  1286.                             # strength 강화일 때는,
  1287.                             # 0번 슬롯에 강화석을, 1번 슬롯에 용혼석을 놓는다.
  1288.                             if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:
  1289.                                 if DragonSoulRefineWindow.REFINE_STONE_SLOT == slotPos:
  1290.                                     reference_vnum = 100300
  1291.                             else:
  1292.                                 reference_vnum = self.__MakeDragonSoulVnum(*self.currentRecipe["ds_info"])
  1293.                             if 0 != reference_vnum:
  1294.                                 item.SelectItem(reference_vnum)
  1295.                                 itemIcon = item.GetIconImage()
  1296.                                 (width, height) = item.GetItemSize()
  1297.                                 self.wndRefineSlot.SetSlot(slotPos, 0, width, height, itemIcon, (1.0, 1.0, 1.0, 0.5))
  1298.                                 # slot 우측 하단에 숫자 뜨면 안 예쁨...
  1299.                                 self.wndRefineSlot.SetSlotCount(slotPos, 0)
  1300.                         except:
  1301.                             pass
  1302.                     # refineSlotLockStartIndex 보다 작은 슬롯은 닫힌 이미지를 보여주면 안됨.
  1303.                     self.wndRefineSlot.HideSlotBaseImage(slotPos)
  1304.                 # slotPos >= self.refineSlotLockStartIndex:
  1305.                 else:
  1306.                     # 정상적인 경우라면 이 if문에 들어갈 일은 없겠지만,
  1307.                     # (애초에 인덱스가 refineSlotLockStartIndex 이상인 슬롯에는 아이템을 넣지 못하게 했기 때문)
  1308.                     # 혹시 모를 에러에 대비함.
  1309.                     if slotPos in self.refineItemInfo:
  1310.                         invenType, invenPos, itemCount = self.refineItemInfo[slotPos]
  1311.                         remainCount = player.GetItemCount(invenType, invenPos)
  1312.                         player.SetItemCount(invenType, invenPos, remainCount + itemCount)
  1313.                         del self.refineItemInfo[slotPos]
  1314.                     # refineSlotLockStartIndex 이상인 슬롯은 닫힌 이미지를 보여줘야함.
  1315.                     self.wndRefineSlot.ShowSlotBaseImage(slotPos)
  1316.            
  1317.             # 강화창에 아무런 아이템이 없다면, 초기화해줌.
  1318.             # 위에서 중간 중간에 "del self.refineItemInfo[slotPos]"를 했기 때문에,
  1319.             # 여기서 한번 체크해줘야함.
  1320.             if not self.refineItemInfo:
  1321.                 self.__Initialize()
  1322.  
  1323.             self.wndRefineSlot.RefreshSlot()
  1324.         except Exception, e:
  1325.             import dbg
  1326.             dbg.TraceError("Exception : __RefreshRefineItemSlot, %s" % e)
  1327.    
  1328.     def __GetEmptySlot(self, itemVnum = 0):
  1329.         # STRENGTH 강화의 경우, 용혼석 슬롯과 강화석 슬롯이 구분되어있기 ‹š문에
  1330.         # vnum을 알아야 한다.
  1331.         if DragonSoulRefineWindow.REFINE_TYPE_STRENGTH == self.currentRefineType:
  1332.             if 0 == itemVnum:
  1333.                 return -1
  1334.            
  1335.             if self.__IsDragonSoul(itemVnum):
  1336.                 if not DragonSoulRefineWindow.DRAGON_SOUL_SLOT in self.refineItemInfo:
  1337.                     return DragonSoulRefineWindow.DRAGON_SOUL_SLOT
  1338.             else:
  1339.                 if not DragonSoulRefineWindow.REFINE_STONE_SLOT in self.refineItemInfo:
  1340.                     return DragonSoulRefineWindow.REFINE_STONE_SLOT
  1341.         else:
  1342.             for slotPos in xrange(self.wndRefineSlot.GetSlotCount()):
  1343.                 if not slotPos in self.refineItemInfo:
  1344.                     return slotPos
  1345.        
  1346.         return -1
  1347.  
  1348.     def AutoSetItem(self, inven, itemCount):
  1349.         invenType, invenPos = inven
  1350.         itemVnum = player.GetItemIndex(invenType, invenPos)
  1351.         emptySlot = self.__GetEmptySlot(itemVnum)
  1352.         if -1 == emptySlot:
  1353.             return
  1354.        
  1355.         self.__SetItem((invenType, invenPos), emptySlot, itemCount)
  1356.  
  1357.     def __ClearResultItemSlot(self):
  1358.         self.wndResultSlot.ClearSlot(0)
  1359.         self.resultItemInfo = {}
  1360.    
  1361.     def RefineSucceed(self, inven_type, inven_pos):
  1362.         self.__Initialize()
  1363.         self.Refresh()
  1364.        
  1365.         itemCount = player.GetItemCount(inven_type, inven_pos)
  1366.         if itemCount > 0:
  1367.             self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)
  1368.             self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)
  1369.    
  1370.     def RefineFail(self, reason, inven_type, inven_pos):
  1371.         if net.DS_SUB_HEADER_REFINE_FAIL == reason:
  1372.             self.__Initialize()
  1373.             self.Refresh()
  1374.             itemCount = player.GetItemCount(inven_type, inven_pos)
  1375.             if itemCount > 0:
  1376.                 self.resultItemInfo[0] = (inven_type, inven_pos, itemCount)
  1377.                 self.wndResultSlot.SetItemSlot(0, player.GetItemIndex(inven_type, inven_pos), itemCount)
  1378.         else:
  1379.             self.Refresh()
  1380.  
  1381.     def SetInventoryWindows(self, wndInventory, wndDragonSoul):
  1382.         self.wndInventory = wndInventory
  1383.         self.wndDragonSoul = wndDragonSoul
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top