Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # cpython modules
- import app
- import player
- import item
- import net
- import dbg
- import wndMgr
- import ikashop
- import chr
- # m2 python modules
- import localeInfo as locale
- import mouseModule as mouse
- import ui
- import uicommon
- import uitooltip
- # python modules
- import datetime
- from _weakref import proxy
- from random import shuffle
- AUCTION_MIN_RAISE_PERCENTAGE = 10
- RESTORE_DURATION_COST = 1000000
- MOVE_SHOP_ENTITY_COST = 100000
- SLOT_SIZE = 32
- MIN_OFFER_PCT = 30 # private offer min % of selling price
- YANG_PER_CHEQUE = 100000000
- ENABLE_DEFAULT_UI_BOARD = 1
- ENABLE_CHEQUE_SYSTEM = getattr(app, "ENABLE_CHEQUE_SYSTEM", 0)
- def debug(fmt, *args):
- if args:
- fmt = fmt.format(*args)
- dbg.Tracen(fmt)
- def debugStack():
- import traceback
- s = traceback.format_stack()
- for line in s[:-1]:
- debug(line)
- def RomeNumber(num):
- nums = {
- 1 : "I", 2 : "II", 3 : "III",
- 4 : "IV", 5 : "V", 6 : "VI",
- 7 : "VII", 8 : "VIII", 9 : "IX",
- }
- return nums.get(num, "X")
- def DatetimeFormat(timestamp):
- try:
- # make datetime object
- dts = datetime.datetime.fromtimestamp(timestamp)
- # make today datetime object
- dtn = datetime.datetime.now()
- # checking for today
- if dts.date() == dtn.date():
- return locale.IKASHOP_DATETIME_TODAY.format(dts.hour, dts.minute)
- # checking for yesterday
- dty = dtn - datetime.timedelta(days=1)
- if dty.date() == dts.date():
- return locale.IKASHOP_DATETIME_YESTERDAY.format(dts.hour, dts.minute)
- # checking for tomorrow
- dty = dtn + datetime.timedelta(days=1)
- if dty.date() == dts.date():
- return locale.IKASHOP_DATETIME_TOMORROW.format(dts.hour, dts.minute)
- # formatting dd/mm/yy hh:mm
- return "{:02d}/{:02d}/{:02d} {:02d}:{:02d}".format(
- dts.day, dts.month, dts.year%100, dts.hour, dts.minute)
- except Exception as e:
- dbg.TraceError("{}: {}".format(e, timestamp))
- def GetScreenSize():
- return wndMgr.GetScreenWidth(), wndMgr.GetScreenHeight()
- class ProxyPrototype(object):
- pass
- def IsProxy(obj):
- if not hasattr(IsProxy, "test"):
- fakeInstance = ProxyPrototype()
- IsProxy.test = proxy(fakeInstance)
- return type(obj) == type(IsProxy.test)
- def SelfDestroyObject(instance):
- def DestroyValue(value):
- if IsProxy(value):
- return True
- if isinstance(value, ui.Window):
- if isinstance(value, IkarusShopWindow):
- value.Destroy()
- else:
- SelfDestroyObject(value)
- return True
- elif type(value) in (list, tuple, dict, set):
- values = value if type(value) != dict else value.values()
- ret = [DestroyValue(val) for val in values]
- return any(ret)
- elif callable(value) and hasattr(value, '__self__'):
- return True
- return False
- def MakeEmptyValue(value):
- if type(value) in (list, tuple, dict, set):
- return type(value)()
- return None
- # skipping all non-window instances
- if not isinstance(instance, ui.Window):
- return
- # skipping all instances already destroyed
- if getattr(instance, "_SelfDestroyed", False):
- return
- # desroying the instance
- instance._SelfDestroyed = True
- for name, value in vars(instance).items():
- if value and DestroyValue(value):
- setattr(instance, name, MakeEmptyValue(value))
- def IsPressingCTRL():
- return app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL)
- def IsPressingSHIFT():
- return app.IsPressed(app.DIK_LSHIFT) or app.IsPressed(app.DIK_RSHIFT)
- def GetInventoryItemHash(win, pos):
- vnum = player.GetItemIndex(win, pos)
- count = player.GetItemCount(win, pos)
- sockets = tuple(player.GetItemMetinSocket(win, pos, i) for i in xrange(player.METIN_SOCKET_MAX_NUM))
- attrs = tuple(player.GetItemAttribute(win, pos, i) for i in xrange(player.ATTRIBUTE_SLOT_MAX_NUM))
- return ikashop.GetItemHash(vnum, count, sockets, attrs)
- def GetAttributeSettings():
- def NoFormat(str):
- removingStrings = ["%", "0", "+", ":"]
- for value in removingStrings:
- str = str.replace(value, "")
- return str.strip()
- values = []
- attributeDict = uitooltip.ItemToolTip.AFFECT_DICT
- for apply, text in attributeDict.items():
- if not isinstance(text, str):
- text = text(0)
- values.append((apply, NoFormat(text)))
- values.sort(key = lambda t : t[1])
- values = [(0, locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT),] + values
- return values
- def IsUsingFilter(filters):
- for filter in filters:
- if isinstance(filter, tuple):
- if IsUsingFilter(filter):
- return True
- elif filter:
- return True
- return False
- def ExtractInputPrice(dialog):
- if ENABLE_CHEQUE_SYSTEM:
- cheque = dialog.GetCheque()
- cheque = cheque.lower().replace("k", "000")
- cheque = int(cheque) if cheque and cheque.isdigit() else 0
- # extracting value
- value = dialog.GetText()
- value = value.lower().replace("k", "000")
- value = long(value) if value and value.isdigit() else 0
- if ENABLE_CHEQUE_SYSTEM:
- if cheque == 0 and value == 0:
- return False, None
- price = value, cheque
- else:
- if value == 0:
- return False, None
- price = value,
- return True, price
- class IkarusShopWindow(ui.Window):
- HALIGN_SETTER = {
- "center" : ui.Window.SetWindowHorizontalAlignCenter,
- "right" : ui.Window.SetWindowHorizontalAlignRight,
- }
- VALIGN_SETTER = {
- "center" : ui.Window.SetWindowVerticalAlignCenter,
- "bottom" : ui.Window.SetWindowVerticalAlignBottom,
- }
- def _ApplyWidgetAlignments(self, child, halign, valign):
- if halign in self.HALIGN_SETTER:
- self.HALIGN_SETTER[halign](child)
- if valign in self.VALIGN_SETTER:
- self.VALIGN_SETTER(child)
- def _RegisterDialog(self, dialog):
- if not hasattr(self, "_dialogs"):
- self._dialogs = []
- self._dialogs.append(dialog)
- def SetTop(self):
- super(IkarusShopWindow, self).SetTop()
- if hasattr(self, "_dialogs"):
- for dialog in self._dialogs:
- dialog.SetTop()
- def Hide(self):
- super(IkarusShopWindow, self).Hide()
- if hasattr(self, "_dialogs"):
- for window in self._dialogs:
- window.Hide()
- def CreateWidget(self, type, x = 0, y = 0, show = True, pos = None, size = None, parent = None, halign = None, valign = None):
- child = type()
- child.SetParent(parent if parent else self)
- if show:
- child.Show()
- if size:
- child.SetSize(*size)
- self._ApplyWidgetAlignments(child, halign, valign)
- if pos:
- x,y = pos
- child.SetPosition(x,y)
- return child
- def Destroy(self):
- super(IkarusShopWindow, self).Destroy()
- # cleaning shitty undestroyable widgets
- if hasattr(self, "questionDialog"):
- SelfDestroyObject(self.questionDialog)
- del self.questionDialog
- if hasattr(self, "popupDialog"):
- SelfDestroyObject(self.popupDialog)
- del self.popupDialog
- if hasattr(self, "moneyInputDialog"):
- SelfDestroyObject(self.moneyInputDialog)
- del self.moneyInputDialog
- if hasattr(self, "itemToolTip"):
- SelfDestroyObject(self.itemToolTip)
- del self.itemToolTip
- # cleaning itself
- SelfDestroyObject(self)
- def OpenQuestionDialog(self, question, acceptEvent, denyEvent = None):
- if getattr(self, "questionDialog", None) == None:
- self.questionDialog = uicommon.QuestionDialog()
- self.questionDialog.SetAcceptText(locale.IKASHOP_QUESTION_DIALOG_CONTINUE_TEXT)
- self.questionDialog.SetCancelText(locale.IKASHOP_QUESTION_DIALOG_CANCEL_TEXT)
- self._RegisterDialog(self.questionDialog)
- self.questionDialog.SetText(question)
- self.questionDialog.SetWidth(self.questionDialog.textLine.GetTextSize()[0] + 40)
- self.questionDialog.SetAcceptEvent(acceptEvent)
- self.questionDialog.SetCancelEvent(denyEvent if denyEvent else self.questionDialog.Hide)
- self.questionDialog.Open()
- def OpenPopupDialog(self, message, seconds = 6):
- if getattr(self, "popupDialog", None) == None:
- self.popupDialog = uicommon.PopupDialog()
- self._RegisterDialog(self.popupDialog)
- self.popupDialog.SetText(message)
- self.popupDialog.SetWidth(self.popupDialog.message.GetTextSize()[0] + 40)
- self.popupDialog.Open()
- self.popupDialog.SetAutoClose(seconds)
- def OpenMoneyInputDialog(self, acceptEvent, denyEvent = None, value = 0, cheque = 0, nocheque = 0):
- # checking for gold overflow
- if ENABLE_CHEQUE_SYSTEM:
- if not nocheque:
- yangmax = 2**31
- while yangmax <= value:
- cheque += 1
- value -= ikashop.YANG_PER_CHEQUE
- if getattr(self, "moneyInputDialog", None) == None:
- self.moneyInputDialog = uicommon.MoneyInputDialog()
- self.moneyInputDialog.SetTitle(locale.IKASHOP_MONEY_INPUT_DIALOG_TITLE)
- self._RegisterDialog(self.moneyInputDialog)
- if ENABLE_CHEQUE_SYSTEM:
- self.moneyInputDialog.HideCheque() if nocheque \
- else self.moneyInputDialog.ShowCheque()
- self.moneyInputDialog.Open()
- self.moneyInputDialog.SetAcceptEvent(acceptEvent)
- self.moneyInputDialog.SetCancelEvent(denyEvent if denyEvent else self.moneyInputDialog.Hide)
- self.moneyInputDialog.SetValue(value if value != 0 else "")
- if ENABLE_CHEQUE_SYSTEM:
- self.moneyInputDialog.SetCheque(cheque if cheque != 0 else "")
- def GetToolTip(self):
- if getattr(self, "itemToolTip", None) == None:
- self.itemToolTip = uitooltip.ItemToolTip()
- self.itemToolTip.itemVnum = 1
- self._RegisterDialog(self.itemToolTip)
- return self.itemToolTip
- def Toggle(self):
- self.Close() if self.IsShow()\
- else self.Open()
- def ShowExclamationMark(self, pos = None):
- rpos = pos if pos else (self.GetWidth() - 14, 1)
- if not hasattr(self, "_ExclamationMark"):
- self._ExclamationMark = self.CreateWidget(ui.ImageBox, pos = rpos )
- self._ExclamationMark.LoadImage("ikashop/lite/mark.png")
- self._ExclamationMark.Show()
- def HideExclamationMark(self):
- if hasattr(self, '_ExclamationMark'):
- self._ExclamationMark.Hide()
- if ENABLE_DEFAULT_UI_BOARD:
- class IkashopBoardWithTitleBar(IkarusShopWindow):
- def __init__(self):
- super(IkashopBoardWithTitleBar, self).__init__()
- self._LoadIkashopBoardWithTitleBar()
- def _LoadIkashopBoardWithTitleBar(self):
- self._internalBoard = self.CreateWidget(ui.BoardWithTitleBar, pos = (-2, -2))
- self._internalBoard.SetSize(self.GetWidth()+6, self.GetHeight()+4)
- def _UpdateView(self):
- if hasattr(self, "_internalBoard"):
- self._internalBoard.SetSize(self.GetWidth()+6, self.GetHeight()+4)
- def SetSize(self, w, h):
- super(IkashopBoardWithTitleBar, self).SetSize(w,h)
- self._UpdateView()
- def SetTitleName(self, title):
- self._internalBoard.SetTitleName(title)
- def SetCloseEvent(self, event, *args):
- self._internalBoard.SetCloseEvent(ui.__mem_func__(event, *args))
- def OnPressEscapeKey(self):
- if self.IsShow():
- self.Close()
- return True
- return False
- else:
- class IkashopBoardWithTitleBar(IkarusShopWindow):
- SIDE_MARGIN = 16
- def __init__(self):
- super(IkashopBoardWithTitleBar, self).__init__()
- self._LoadIkashopBoardWithTitleBar()
- def _LoadIkashopBoardWithTitleBar(self):
- # loading center
- self.centerImage = self.CreateWidget(ui.ExpandedImageBox, x = 3, y = 30)
- self.centerImage.LoadImage("ikashop/lite/common/board/center.png")
- self.centerImage.AddFlag("not_pick")
- # loading sides
- self.leftSide = self.CreateWidget(ui.ExpandedImageBox, y = self.SIDE_MARGIN)
- self.leftSide.LoadImage("ikashop/lite/common/board/left.png")
- self.leftSide.AddFlag("not_pick")
- self.rightSide = self.CreateWidget(ui.ExpandedImageBox, y = self.SIDE_MARGIN)
- self.rightSide.LoadImage("ikashop/lite/common/board/right.png")
- self.rightSide.AddFlag("not_pick")
- self.bottomSide = self.CreateWidget(ui.ExpandedImageBox, x = self.SIDE_MARGIN)
- self.bottomSide.LoadImage("ikashop/lite/common/board/bottom.png")
- self.bottomSide.AddFlag("not_pick")
- # loading corners
- self.leftBottomCorner = self.CreateWidget(ui.ImageBox)
- self.leftBottomCorner.LoadImage("ikashop/lite/common/board/lb_corner.png")
- self.leftBottomCorner.AddFlag("not_pick")
- self.rightBottomCorner = self.CreateWidget(ui.ImageBox)
- self.rightBottomCorner.LoadImage("ikashop/lite/common/board/rb_corner.png")
- self.rightBottomCorner.AddFlag("not_pick")
- # loading titlebar
- self.titleLeft = self.CreateWidget(ui.ImageBox)
- self.titleLeft.LoadImage("ikashop/lite/common/board/titlebar/left.png")
- self.titleLeft.AddFlag("not_pick")
- self.titleRight = self.CreateWidget(ui.ImageBox)
- self.titleRight.LoadImage("ikashop/lite/common/board/titlebar/right.png")
- self.titleRight.AddFlag("not_pick")
- self.titleCenter = self.CreateWidget(ui.ExpandedImageBox, x = self.titleLeft.GetWidth())
- self.titleCenter.LoadImage("ikashop/lite/common/board/titlebar/center.png")
- self.titleCenter.AddFlag("not_pick")
- self.closeButton = self.CreateWidget(ui.Button, y = 3)
- self.closeButton.SetUpVisual("ikashop/lite/common/board/titlebar/close/default.png")
- self.closeButton.SetDownVisual("ikashop/lite/common/board/titlebar/close/default.png")
- self.closeButton.SetOverVisual("ikashop/lite/common/board/titlebar/close/hover.png")
- self.titleText = self.CreateWidget(ui.TextLine)
- self.titleText.SetHorizontalAlignCenter()
- self.titleText.SetFontName("Tahoma:20")
- self.titleText.SetPackedFontColor(0xFFFFFFFF)
- self.titleText.SetOutline(1)
- self.titleText.AddFlag("not_pick")
- def _UpdateView(self):
- if getattr(self, "centerImage", None) == None:
- return
- width = float(self.GetWidth())
- height = float(self.GetHeight())
- # updating center
- centerWidth = width - 6
- centerHeight = height - 33
- centerHorizontalScale = centerWidth / self.centerImage.GetWidth()
- centerVerticalScale = centerHeight / self.centerImage.GetHeight()
- self.centerImage.SetRenderingRect(0.0, 0.0, centerHorizontalScale - 1.0, centerVerticalScale - 1.0)
- # updating sides
- sideVerticalScale = (height - self.SIDE_MARGIN*2) / self.leftSide.GetHeight()
- self.leftSide.SetRenderingRect(0.0, 0.0, 0.0, sideVerticalScale - 1.0)
- sideVerticalScale = (height - self.SIDE_MARGIN*2) / self.rightSide.GetHeight()
- self.rightSide.SetRenderingRect(0.0, 0.0, 0.0, sideVerticalScale - 1.0)
- self.rightSide.SetPosition(width - self.rightSide.GetWidth(), self.SIDE_MARGIN)
- sideHorizontalScale = (width - self.SIDE_MARGIN*2) / self.bottomSide.GetWidth()
- self.bottomSide.SetRenderingRect(0.0, 0.0, sideHorizontalScale - 1.0, 0.0)
- self.bottomSide.SetPosition(self.SIDE_MARGIN, height - self.bottomSide.GetHeight())
- # updating corner positions
- self.leftBottomCorner.SetPosition(0, height - self.leftBottomCorner.GetHeight())
- self.rightBottomCorner.SetPosition(width - self.rightBottomCorner.GetWidth(), height - self.rightBottomCorner.GetHeight())
- # updating titlebar
- titlebarCenterWidth = width - self.titleLeft.GetWidth() - self.titleRight.GetWidth()
- titlebarCenterWidth = max(10, titlebarCenterWidth)
- titlebarCenterScale = titlebarCenterWidth / self.titleCenter.GetWidth()
- self.titleCenter.SetScale(titlebarCenterScale, 1.0)
- self.titleRight.SetPosition(titlebarCenterWidth + self.titleLeft.GetWidth(), 0)
- self.closeButton.SetPosition(width - self.closeButton.GetWidth() - 6, self.closeButton.GetLocalPosition()[1])
- self.titleText.SetPosition(width/2, 3)
- def SetSize(self, w, h):
- super(IkashopBoardWithTitleBar, self).SetSize(w,h)
- self._UpdateView()
- def SetTitleName(self, title):
- self.titleText.SetText(title)
- def SetCloseEvent(self, event, *args):
- self.closeButton.SetEvent(event, *args)
- def OnPressEscapeKey(self):
- if self.IsShow():
- self.Close()
- return True
- return False
- class IkarusShopSafeboxBoard(IkashopBoardWithTitleBar):
- GRID_COLUMNS = ikashop.SAFEBOX_GRID_WIDTH
- GRID_ROWS = ikashop.SAFEBOX_GRID_HEIGHT
- PAGE_COUNT = ikashop.SAFEBOX_PAGE_COUNT
- def __init__(self):
- super(IkarusShopSafeboxBoard, self).__init__()
- self.items = []
- self._SettingUpBoard()
- self._LoadIkarusShopSafeboxBoard()
- def _SettingUpBoard(self):
- sw, sh = GetScreenSize()
- self.SetSize(324, 438)
- self.SetTitleName(locale.IKASHOP_SAFEBOX_BOARD_TITLE)
- self.SetCloseEvent(self.Close)
- self.SetPosition(sw/2 - self.GetWidth(), sh / 2 - self.GetHeight()/2)
- self.AddFlag("movable")
- self.AddFlag("float")
- def _LoadIkarusShopSafeboxBoard(self):
- # making slot box
- self.slotBox = self.CreateWidget(ui.ImageBox, pos = (11, 35))
- self.slotBox.LoadImage("ikashop/lite/safebox/slot_box.png")
- self.slotWindow = self.CreateWidget(ui.GridSlotWindow, parent = self.slotBox, pos = (6,6))
- self.slotWindow.ArrangeSlot(0, self.GRID_COLUMNS, self.GRID_ROWS, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slotWindow.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slotWindow.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
- self.slotWindow.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
- self.slotWindow.SetSelectItemSlotEvent(self._OnClickItemSlot)
- # making money box
- self.moneyBox = self.CreateWidget(ui.ImageBox, pos = (11, 404))
- self.moneyBox.LoadImage("ikashop/lite/safebox/money_box.png")
- mx, my = self.moneyBox.GetLocalPosition()
- self.moneyText = self.CreateWidget(ui.TextLine, parent = self.moneyBox, pos = (23, 4))
- self.moneyText.SetFontName("Tahoma:11")
- self.moneyText.SetPackedFontColor(0xFFFFFFFF)
- self.moneyText.SetText(locale.NumberToString(2**31))
- self.moneyClaimButton = self.CreateWidget(ui.Button, pos = (mx + self.moneyBox.GetWidth() + 2, my))
- self.moneyClaimButton.SetUpVisual("ikashop/lite/safebox/buttons/claim_money/default.png")
- self.moneyClaimButton.SetOverVisual("ikashop/lite/safebox/buttons/claim_money/hover.png")
- self.moneyClaimButton.SetDownVisual("ikashop/lite/safebox/buttons/claim_money/default.png")
- self.moneyClaimButton.SetToolTipText(locale.IKASHOP_SAFEBOX_CLAIM_MONEY_BUTTON_TEXT)
- self.moneyClaimButton.SetEvent(self._OnClickClaimMoneyButton)
- # making page selection box
- self.selectPageButtons = []
- for i in xrange(self.PAGE_COUNT):
- selectPageButton = self.CreateWidget(ui.Button, pos = (158 + i*41, 405))
- selectPageButton.SetUpVisual("ikashop/lite/safebox/buttons/select_page/default.png")
- selectPageButton.SetDownVisual("ikashop/lite/safebox/buttons/select_page/default.png")
- selectPageButton.SetOverVisual("ikashop/lite/safebox/buttons/select_page/hover.png")
- selectPageButton.SetDisableVisual("ikashop/lite/safebox/buttons/select_page/disabled.png")
- selectPageButton.SetText(RomeNumber(i+1))
- selectPageButton.SAFE_SetEvent(self._OnSelectPage, i)
- self.selectPageButtons.append(selectPageButton)
- # making claim items button
- self.itemsClaimButton = self.CreateWidget(ui.Button, pos = (158 + self.PAGE_COUNT*41 + 2, 405))
- self.itemsClaimButton.SetUpVisual("ikashop/lite/safebox/buttons/claim_items/default.png")
- self.itemsClaimButton.SetDownVisual("ikashop/lite/safebox/buttons/claim_items/default.png")
- self.itemsClaimButton.SetOverVisual("ikashop/lite/safebox/buttons/claim_items/hover.png")
- self.itemsClaimButton.SetToolTipText(locale.IKASHOP_SAFEBOX_CLAIM_ITEMS_BUTTON_TEXT)
- self.itemsClaimButton.SAFE_SetEvent(self._OnClickClaimAllItemsButton)
- # default opening first page
- self._OnSelectPage(0)
- def _OnSelectPage(self, num):
- for button in self.selectPageButtons:
- button.Enable()
- self.selectPageButtons[num].Disable()
- self.currentPage = num
- self._RefreshPage()
- def _RefreshPage(self):
- cells = self.GRID_COLUMNS * self.GRID_ROWS
- srange = cells * self.currentPage
- erange = srange + cells
- for i in xrange(srange, erange):
- local = i - srange
- if not i in self.items:
- self.slotWindow.ClearSlot(local)
- continue
- data = self.items[i]
- count = data['count'] if data['count'] > 1 else 0
- self.slotWindow.SetItemSlot(local, data['vnum'], count)
- self.slotWindow.RefreshSlot()
- def _RefreshItems(self, items):
- self.items = {item['cell'] : item for item in items}
- self._RefreshPage()
- def _ShowToolTipOnItemSlot(self, slot):
- slot = slot + self.currentPage * (self.GRID_COLUMNS * self.GRID_ROWS)
- if slot in self.items:
- data = self.items[slot]
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
- tooltip.AppendTextLine(locale.IKASHOP_SAFEBOX_CLAIM_ITEM_TOOLTIP)
- tooltip.ShowToolTip()
- def _HideToolTipOnItemSlot(self, slot=0):
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.HideToolTip()
- def _OnClickItemSlot(self, cell):
- cell = cell + self.currentPage * (self.GRID_COLUMNS * self.GRID_ROWS)
- if cell in self.items:
- data = self.items[cell]
- ikashop.SendSafeboxGetItem(data['id'])
- def _OnClickClaimAllItemsButton(self):
- self.OpenQuestionDialog(
- locale.IKASHOP_SAFEBOX_CLAIM_ALL_ITEMS_QUESTION, self._OnAcceptClaimAllItemsQuestion)
- def _OnClickClaimMoneyButton(self):
- ikashop.SendSafeboxGetValutes()
- def _OnAcceptClaimAllItemsQuestion(self):
- self.questionDialog.Hide()
- for item in self.items.values():
- ikashop.SendSafeboxGetItem(item['id'])
- def Open(self):
- self.SetTop()
- if not self.IsShow():
- ikashop.SendSafeboxOpen()
- def Setup(self, yang, items):
- if not self.IsShow():
- self.Show()
- self.SetTop()
- self.moneyText.SetText(locale.NumberToString(yang))
- self._RefreshItems(items)
- def RemoveItem(self, itemid):
- items = [data for data in self.items.values() if data['id'] != itemid]
- self._RefreshItems(items)
- def AddItem(self, item):
- items = list(self.items.values()) + [item,]
- self._RefreshItems(items)
- def Destroy(self):
- super(IkarusShopSafeboxBoard, self).Destroy()
- def Close(self):
- ikashop.SendSafeboxClose()
- self.Hide()
- class IkarusCreateAuctionDialog(IkashopBoardWithTitleBar):
- def __init__(self):
- super(IkarusCreateAuctionDialog, self).__init__()
- self._LoadIkarusCreateAuctionDialog()
- self._InsertedItem = None
- self._ItemInfo = None
- def _LoadIkarusCreateAuctionDialog(self):
- self._SettingUpBoard()
- # loading slot
- self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (self.GetWidth()/2- 17, 45))
- self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slot.SetSelectEmptySlotEvent(self._OnClickEmptySlot)
- self.slot.SetSelectItemSlotEvent(self._OnClickItemSlot)
- self.slot.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
- self.slot.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
- # loading continue button
- self.proceedButton = self.CreateWidget(ui.Button, pos = (self.GetWidth() / 2 - 53, self.GetHeight() - 40))
- self.proceedButton.SetUpVisual("ikashop/lite/auction/raise_button/default.png")
- self.proceedButton.SetDownVisual("ikashop/lite/auction/raise_button/default.png")
- self.proceedButton.SetOverVisual("ikashop/lite/auction/raise_button/hover.png")
- self.proceedButton.SetText(locale.IKASHOP_ACUTION_CREATE_CREATE_BUTTON)
- self.proceedButton.SAFE_SetEvent(self._OnClickCreateAuction)
- self.proceedButton.Show()
- self.proceedButton.ButtonText.SetPosition(self.proceedButton.GetWidth()/2 + 12, self.proceedButton.GetHeight()/2-1)
- def _SettingUpBoard(self):
- sw, sh = GetScreenSize()
- self.SetSize(145, 195)
- self.SetTitleName(locale.IKASHOP_AUCTION_CREATE_BOARD_TITLE)
- self.SetCloseEvent(self.Close)
- self.SetPosition(sw/2 - self.GetWidth()/2, sh / 2 - self.GetHeight()/2)
- self.AddFlag("movable")
- self.AddFlag("float")
- def _Reset(self):
- # reset slots
- for i in xrange(3):
- self.slot.ClearSlot(i)
- self.slot.RefreshSlot()
- if hasattr(self, "moneyInputDialog"):
- self.moneyInputDialog.SoftClose()
- self._InsertedItem = None
- self._ItemInfo = None
- def _OnClickEmptySlot(self, slot):
- if self._InsertedItem != None:
- return
- if mouse.mouseController.isAttached():
- attachedType = mouse.mouseController.GetAttachedType()
- attachedItemIndex = mouse.mouseController.GetAttachedItemIndex()
- attachedItemSlotPos = mouse.mouseController.GetAttachedSlotNumber()
- mouse.mouseController.DeattachObject()
- # validating attached item
- if attachedType in (player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, player.SLOT_TYPE_INVENTORY):
- win, pos = player.SlotTypeToInvenType(attachedType), attachedItemSlotPos
- if player.ITEM_MONEY != attachedItemIndex:
- self.InsertItemInSlot(win, pos)
- def _OnClickItemSlot(self, slot):
- if mouse.mouseController.isAttached():
- return
- self._Reset()
- def _ShowToolTipOnItemSlot(self, slot):
- win, pos = self._InsertedItem
- tooltip = self.GetToolTip()
- tooltip.SetInventoryItem(pos, win)
- tooltip.AppendTextLine(locale.IKASHOP_AUCTION_CREATE_REMOVE_ITEM)
- def _HideToolTipOnItemSlot(self, slot = 0):
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.HideToolTip()
- def _OnClickCreateAuction(self):
- self.OpenMoneyInputDialog(self._OnAcceptStartingPriceInput, nocheque = 1)
- if app.EXTEND_IKASHOP_ULTIMATE:
- vnum, count, hash = self._ItemInfo
- ikashop.SendPriceAverageRequest(vnum, count)
- self.moneyInputDialog.SetPriceAverage(-1)
- def _OnAcceptStartingPriceInput(self):
- # extracting value
- value = self.moneyInputDialog.GetText()
- value = value.lower().replace("k", "000")
- self.moneyInputDialog.SoftClose()
- # validating value
- if not value or not value.isdigit():
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
- return
- if self._InsertedItem is None:
- return
- win, pos = self._InsertedItem
- self.Close()
- ikashop.SendAuctionCreate(win, pos, long(value))
- return True
- def InsertItemInSlot(self, win, pos):
- vnum = player.GetItemIndex(win, pos)
- count = player.GetItemCount(win, pos)
- # checking item antifalg
- item.SelectItem(vnum)
- if item.IsAntiFlag(item.ANTIFLAG_GIVE) or item.IsAntiFlag(item.ANTIFLAG_MYSHOP):
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM)
- return
- self._InsertedItem = win, pos
- self._ItemInfo = vnum, count, GetInventoryItemHash(win, pos)
- self.slot.SetItemSlot(0, vnum, count if count > 1 else 0)
- self.slot.RefreshSlot()
- def Open(self):
- self._Reset()
- self.Show()
- self.SetTop()
- if app.EXTEND_IKASHOP_PRO:
- player.RefreshInventory()
- def Close(self):
- self.Hide()
- if app.EXTEND_IKASHOP_PRO:
- player.RefreshInventory()
- def OnUpdate(self):
- if self._ItemInfo != None:
- win, pos = self._InsertedItem
- vnum, count, hash = self._ItemInfo
- if vnum != player.GetItemIndex(win, pos):
- self._Reset()
- elif count != player.GetItemCount(win, pos):
- self._Reset()
- elif hash != GetInventoryItemHash(win, pos):
- self._Reset()
- class IkarusShopAuctionOfferView(IkarusShopWindow):
- def __init__(self):
- super(IkarusShopAuctionOfferView, self).__init__()
- self._LoadIkarusShopAuctionOfferView()
- def _LoadIkarusShopAuctionOfferView(self):
- # making background and fitting its size
- self.background = self.CreateWidget(ui.ImageBox, pos = ())
- self.background.LoadImage("ikashop/lite/auction/offer_box.png")
- self.SetSize(self.background.GetWidth(), self.background.GetHeight())
- # making name text
- self.nameText = self.CreateWidget(ui.TextLine, pos = (28, 5))
- self.nameText.SetPackedFontColor(0xFFFFFFFF)
- self.nameText.SetFontName("Tahoma:11")
- # making datetime
- self.datetimeText = self.CreateWidget(ui.TextLine, pos = (168 + 13, 5))
- self.datetimeText.SetPackedFontColor(0xFFFFFFFF)
- self.datetimeText.SetHorizontalAlignCenter()
- # making money text
- self.moneyText = self.CreateWidget(ui.TextLine, pos = (256 + 13, 5))
- self.moneyText.SetPackedFontColor(0xFFFFFFFF)
- def Setup(self, pos, data):
- name, datetime, price = data['buyername'], data['datetime'], data['price']
- self.nameText.SetText("{}. {}".format(pos, name))
- self.datetimeText.SetText(DatetimeFormat(datetime))
- self.moneyText.SetText(locale.NumberToString(price))
- self.Show()
- class IkarusShopAuctionOwnerBoard(IkashopBoardWithTitleBar):
- OFFER_VIEW_COUNT = 6
- OFFER_VIEW_HEIGHT = 28
- RAISE_FACTOR = 1.0 + float(AUCTION_MIN_RAISE_PERCENTAGE) / 100.0
- def __init__(self):
- super(IkarusShopAuctionOwnerBoard, self).__init__()
- self._SettingUpBoard()
- self._LoadIkarusShopAuctionOwnerBoard()
- def _SettingUpBoard(self):
- sw, sh = GetScreenSize()
- self.SetSize(513 + 13, 249)
- self.SetTitleName(locale.IKASHOP_AUCTION_BOARD_TITLE)
- self.SetCloseEvent(self.Close)
- self.SetPosition(sw/2 - self.GetWidth(), sh / 2 - self.GetHeight()/2 + 100)
- self.AddFlag("movable")
- self.AddFlag("float")
- def _LoadIkarusShopAuctionOwnerBoard(self):
- # making info box
- self.infoBox = self.CreateWidget(ui.ImageBox, pos = (12, 36))
- self.infoBox.LoadImage("ikashop/lite/auction/info_box.png")
- self.infoBox.SetMouseWheelEvent(self._MouseWheelScrollOffers)
- self.minRaiseText = self.CreateWidget(ui.TextLine, pos = (458+13, 221-36), parent = self.infoBox)
- self.minRaiseText.SetPackedFontColor(0xFFFFFFFF)
- self.minRaiseText.SetHorizontalAlignRight()
- self.durationText = self.CreateWidget(ui.TextLine, pos = (141, 221-36), parent = self.infoBox)
- self.durationText.SetPackedFontColor(0xFFFFFFFF)
- # making slot
- self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (36, 44), size = (32, 98), parent = self.infoBox)
- self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slot.SetOverInItemEvent(self._OverInItem)
- self.slot.SetOverOutItemEvent(self._OverOutItem)
- # making scrollbar
- self.offerScrollbar = self.CreateWidget(ui.ScrollBar, pos = (470+13, 4), parent = self.infoBox)
- self.offerScrollbar.SetScrollBarSize(self.infoBox.GetHeight() - 35)
- self.offerScrollbar.SetScrollEvent(self._ScrollOffers)
- # making cancel auction button
- self.cancelAuctionButton = self.CreateWidget(ui.Button, pos = (12, self.GetHeight() - 33))
- self.cancelAuctionButton.SetUpVisual("ikashop/lite/auction/cancel_button/default.png")
- self.cancelAuctionButton.SetDownVisual("ikashop/lite/auction/cancel_button/default.png")
- self.cancelAuctionButton.SetOverVisual("ikashop/lite/auction/cancel_button/hover.png")
- self.cancelAuctionButton.SetText(locale.IKASHOP_ACUTION_CANCEL_AUCTION_BUTTON)
- self.cancelAuctionButton.SAFE_SetEvent(self._OnClickCancelAuction)
- self.cancelAuctionButton.Show()
- # making offers
- self.offerViews = []
- for i in xrange(self.OFFER_VIEW_COUNT):
- self.offerViews.append(self.CreateWidget(
- IkarusShopAuctionOfferView, pos = (115, 6 + i*self.OFFER_VIEW_HEIGHT), parent = self.infoBox))
- def _RefreshOffers(self):
- # calculating count difference
- diff = len(self.offers) - self.OFFER_VIEW_COUNT
- diff = max(diff, 0)
- # calculating ranges
- offset = self.offerScrollbar.GetPos()
- sindex = int(diff * offset)
- eindex = sindex + min(self.OFFER_VIEW_COUNT, len(self.offers))
- # iterating over views
- for i, view in enumerate(self.offerViews):
- ri = i + sindex
- view.Hide() if ri >= eindex \
- else view.Setup(ri+1, self.offers[ri])
- # updating scrollbar middlebar length
- viewHeight = self.OFFER_VIEW_HEIGHT
- self.offerScrollbar.UpdateScrollbarLenght(viewHeight * len(self.offers))
- def _MouseWheelScrollOffers(self, delta):
- if self.offerScrollbar.IsShow():
- self.offerScrollbar.OnDown() if delta < 0 \
- else self.offerScrollbar.OnUp()
- return True
- def _ScrollOffers(self):
- if self.offerScrollbar.IsShow():
- self._RefreshOffers()
- def _UpdateScrollbarState(self):
- self.offerScrollbar.SetPos(0)
- if len(self.offers) <= self.OFFER_VIEW_COUNT:
- self.offerScrollbar.Hide()
- else:
- self.offerScrollbar.Show()
- def _OverInItem(self, slot):
- data = self.auctionInfo
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
- if app.EXTEND_IKASHOP_ULTIMATE:
- tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
- else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
- tooltip.ShowToolTip()
- def _OverOutItem(self, slot = 0):
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.HideToolTip()
- def _OnClickCancelAuction(self):
- if self.auctionInfo['offers']:
- self.OpenPopupDialog(locale.IKASHOP_AUCTION_CANNOT_CANCEL)
- return
- self.OpenQuestionDialog(locale.IKASHOP_AUCTION_CANCEL_AUCTION_QUESTION, self._OnAcceptCancelAuction)
- def _OnAcceptCancelAuction(self):
- ikashop.SendMyAuctionCancel()
- self.questionDialog.Close()
- self.Close()
- def SetOffers(self, offers):
- self.offers = sorted(offers, key = lambda val : val['datetime'], reverse=True)
- self._UpdateScrollbarState()
- self._RefreshOffers()
- self.RefreshMinRaise()
- def SetDuration(self, duration):
- self.durationText.SetText(locale.SecondToDHM(duration*60))
- def _GetMinRaise(self):
- if not self.offers:
- return self.auctionInfo['price']
- minraise = max([val['price'] for val in self.offers])
- if minraise < 1000:
- return minraise + 1000
- return minraise * (100+AUCTION_MIN_RAISE_PERCENTAGE) / 100
- def RefreshMinRaise(self):
- self.minRaise = self._GetMinRaise()
- self.minRaiseText.SetText(locale.IKASHOP_AUCTION_MIN_BID + ' ' + locale.NumberToString(self.minRaise))
- def Open(self):
- ikashop.SendMyAuctionOpen()
- def Close(self):
- self.Hide()
- ikashop.SendMyAuctionClose()
- def Setup(self, data):
- # storing data
- self.auctionInfo = data
- # refreshing duration
- seconds = data['duration'] * 60
- self.durationText.SetText(locale.SecondToDHM(seconds))
- # refreshing item
- vnum = data['vnum']
- count = data['count'] if data['count'] > 1 else 0
- item.SelectItem(vnum)
- size = item.GetItemSize()[1]
- self.slot.ArrangeSlot(0, 1, size, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slot.SetItemSlot(0, vnum, count)
- # refreshing offers
- self.SetOffers(data['offers'])
- if not self.IsShow():
- self.Show()
- self.SetTop()
- class IkarusShopListBoard(IkashopBoardWithTitleBar):
- def _LoadIkarusShopListBoard(self):
- # making board box
- self.boardBox = self.CreateWidget(ui.ExpandedImageBox, pos = (11,36))
- self.boardBox.LoadImage("ikashop/lite/list_box.png")
- boardBoxHorizontalScale = float(self.GetWidth() - 22 - 16) / self.boardBox.GetWidth()
- boardBoxVerticalScale = float(self.GetHeight() - 47) / self.boardBox.GetHeight()
- self.boardBox.SetScale(boardBoxHorizontalScale, boardBoxVerticalScale)
- self.boardBox.SetMouseWheelEvent(self._MouseWheelScrollElements)
- # making scrollbar
- self.elementScrollbar = self.CreateWidget(ui.ScrollBar, pos = (self.GetWidth() - 24, 36))
- self.elementScrollbar.SetScrollBarSize(self.boardBox.GetHeight())
- self.elementScrollbar.SetScrollEvent(self._ScrollElements)
- # making empty header
- self.emptyHeader = self.CreateWidget(ui.TextLine, pos = (self.GetWidth()/2, self.GetHeight()/2 - 10))
- self.emptyHeader.SetFontName("Tahoma:14")
- self.emptyHeader.SetPackedFontColor(0xFFFFFFFF)
- self.emptyHeader.SetOutline(1)
- self.emptyHeader.SetHorizontalAlignCenter()
- self.emptyHeader.SetVerticalAlignCenter()
- self.emptyHeader.SetText(locale.IKASHOP_GENERIC_LIST_EMPTY_HEADER)
- def _SettingUpBoard(self):
- sw, sh = GetScreenSize()
- self.SetCloseEvent(getattr(self, "Close", self.Hide))
- self.SetPosition(sw/2 + 20 - (self.GetWidth() - 200), sh / 2 - self.GetHeight()/2)
- self.AddFlag("movable")
- self.AddFlag("float")
- def _MakeListElements(self, type, viewCount):
- self.viewCount = viewCount
- # making notifiction boxes
- self.views = []
- for i in xrange(self.viewCount):
- view = self.CreateWidget(type, parent = self.boardBox)
- space = view.GetHeight()+2
- view.SetPosition(9, 7 + i * space)
- self.views.append(view)
- def _ScrollElements(self):
- if self.elementScrollbar.IsShow():
- self._RefreshElements()
- def _MouseWheelScrollElements(self, delta):
- if self.elementScrollbar.IsShow():
- self.elementScrollbar.OnDown() if delta < 0 \
- else self.elementScrollbar.OnUp()
- return True
- def _UpdateScrollbarState(self):
- if len(self.elements) <= self.viewCount:
- self.elementScrollbar.SetPos(0)
- self.elementScrollbar.Hide()
- else:
- self.elementScrollbar.Show()
- def _RefreshElements(self):
- # calculating count difference
- diff = len(self.elements) - self.viewCount
- diff = max(diff, 0)
- # calculating ranges
- offset = self.elementScrollbar.GetPos()
- sindex = int(diff * offset)
- eindex = sindex + min(self.viewCount, len(self.elements))
- # iterating over views
- for i, view in enumerate(self.views):
- ri = i + sindex
- if ri >= eindex:
- view.Hide()
- else:
- view.Setup(self.elements[ri])
- view.Show()
- # updating scrollbar middlebar length
- viewHeight = self.views[0].GetHeight()+2
- self.elementScrollbar.UpdateScrollbarLenght(viewHeight * len(self.elements))
- def SetElements(self, elements):
- self.elements = elements
- self._UpdateScrollbarState()
- self._RefreshElements()
- self.emptyHeader.Show() if not elements \
- else self.emptyHeader.Hide()
- class IkarusShopOfferView(IkarusShopWindow):
- def __init__(self):
- super(IkarusShopOfferView, self).__init__()
- self._LoadIkarusShopOfferView()
- def _LoadIkarusShopOfferView(self):
- # making background
- self.background = self.CreateWidget(ui.ExpandedImageBox)
- self.background.LoadImage("ikashop/lite/search_shop/result_item_box.png")
- self.SetSize(self.background.GetWidth(), self.background.GetHeight())
- # making textlines
- self.itemName = self.CreateWidget(ui.TextLine, pos = (60, 17 - 6))
- self.itemName.SetPackedFontColor(0xFFFFFFFF)
- self.sellerName = self.CreateWidget(ui.TextLine, pos = (78, 41 - 6))
- self.duration = self.CreateWidget(ui.TextLine, pos = (226, 41 - 6))
- self.price = self.CreateWidget(ui.TextLine, pos = (78, 58))
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.priceAverage = self.CreateWidget(ui.TextLine, pos = (330-8, 58))
- self.priceAverage.SetHorizontalAlignRight()
- # making buttons
- self.acceptOfferButton = self.CreateWidget(ui.Button, pos = (261, 84))
- self.acceptOfferButton.SetUpVisual("ikashop/lite/search_shop/buy_button/default.png")
- self.acceptOfferButton.SetDownVisual("ikashop/lite/search_shop/buy_button/default.png")
- self.acceptOfferButton.SetOverVisual("ikashop/lite/search_shop/buy_button/hover.png")
- self.acceptOfferButton.SAFE_SetEvent(self._OnClickAcceptOffer)
- self.acceptOfferButton.SetText(locale.IKASHOP_OFFER_LIST_ACCEPT_OFFER_BUTTON_TEXT)
- self.cancelOfferButton = self.CreateWidget(ui.Button, pos = (189, 84))
- self.cancelOfferButton.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
- self.cancelOfferButton.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
- self.cancelOfferButton.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
- self.cancelOfferButton.SAFE_SetEvent(self._OnClickCancelButton)
- self.cancelOfferButton.SetText(locale.IKASHOP_SEARCH_SHOP_OFFER_BUTTON_TEXT)
- # making slot item
- self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (9, 7))
- self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slot.SetOverInItemEvent(self._OverInItem)
- self.slot.SetOverOutItemEvent(self._OverOutItem)
- def _OverInItem(self, slot):
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.AddItemData(self.itemData['vnum'], self.itemData['sockets'], self.itemData['attrs'])
- tooltip.ShowToolTip()
- def _OverOutItem(self):
- tooltip = self.GetToolTip()
- tooltip.HideToolTip()
- def _OnClickAcceptOffer(self):
- self.OpenQuestionDialog(locale.IKASHOP_OFFER_LIST_ACCEPT_OFFER_QUESTION, self._OnAcceptOffer)
- def _OnClickCancelButton(self):
- self.OpenQuestionDialog(locale.IKASHOP_OFFER_LIST_CANCEL_OFFER_QUESTION, self._OnCancelOffer)
- def _OnAcceptOffer(self):
- self.questionDialog.Hide()
- ikashop.SendOfferAccept(self.data['id'])
- def _OnCancelOffer(self):
- self.questionDialog.Hide()
- ikashop.SendOfferCancel(self.data['id'], self.data['ownerid'])
- def Setup(self, data):
- self.ShowExclamationMark() if data['incoming']\
- else self.HideExclamationMark()
- self.acceptOfferButton.Show() if data['incoming']\
- else self.acceptOfferButton.Hide()
- self.cancelOfferButton.SetText(locale.IKASHOP_OFFER_LIST_DENY_OFFER_BUTTON_TEXT) if data['incoming']\
- else self.cancelOfferButton.SetText(locale.IKASHOP_OFFER_LIST_CANCEL_OFFER_BUTTON_TEXT)
- self.cancelOfferButton.SetPosition(189, 84) if data['incoming']\
- else self.cancelOfferButton.SetPosition(261, 84)
- self.background.LoadImage("ikashop/lite/offer_list/incoming_offer.png") if data['incoming']\
- else self.background.LoadImage("ikashop/lite/offer_list/outcoming_offer.png")
- # setting itemname
- itemData = data['item']
- item.SelectItem(itemData['vnum'])
- itemName = item.GetItemName()
- self.itemName.SetText(itemName)
- # setting seller name
- self.sellerName.SetText(data['buyer_name']) if data['incoming']\
- else self.sellerName.SetText(data['name'])
- # setting duration
- self.duration.SetText(DatetimeFormat(data['datetime']))
- # setting price
- self.price.SetText(locale.NumberToString(data['price']))
- if app.EXTEND_IKASHOP_ULTIMATE:
- pa = locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE_EMOJI if itemData['priceavg'] == 0 \
- else locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_EMOJI.format(locale.NumberToMoneyString(itemData['priceavg']))
- self.priceAverage.SetText(pa)
- # setting slot
- itemcount = itemData['count'] if itemData['count'] > 1 else 0
- self.slot.ArrangeSlot(0, 1, item.GetItemSize()[1], SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slot.SetItemSlot(0, itemData['vnum'], itemcount)
- self.data = data
- self.itemData = itemData
- class IkarusShopOffersBoard(IkarusShopListBoard):
- OFFER_VIEW_COUNT = 3
- def __init__(self):
- super(IkarusShopOffersBoard, self).__init__()
- self._SettingUpBoard()
- self._LoadIkarusShopOffersBoard()
- def _SettingUpBoard(self):
- self.SetSize(395, 399)
- self.SetTitleName(locale.IKASHOP_OFFER_LIST_BOARD_TITLE)
- super(IkarusShopOffersBoard, self)._SettingUpBoard()
- def _LoadIkarusShopOffersBoard(self):
- self._LoadIkarusShopListBoard()
- self._MakeListElements(IkarusShopOfferView, self.OFFER_VIEW_COUNT)
- def SetOffers(self, offers):
- self.offers = sorted(offers, key = lambda val : val['datetime'], reverse=True)
- self.SetElements(self.offers)
- self.Show()
- self.SetTop()
- def Open(self):
- ikashop.SendOfferListRequest()
- def Close(self):
- self.Hide()
- ikashop.SendOffersListClose()
- if app.EXTEND_IKASHOP_PRO:
- class IkarusShopNotificationView(IkarusShopWindow):
- def __init__(self):
- super(IkarusShopNotificationView, self).__init__()
- self._LoadIkarusShopNotificationView()
- def _LoadIkarusShopNotificationView(self):
- # making background and fitting its size
- self.background = self.CreateWidget(ui.ImageBox)
- self.background.LoadImage("ikashop/pro/notification/notification_box.png")
- self.SetSize(self.background.GetWidth(), self.background.GetHeight())
- # making what
- self.whatText = self.CreateWidget(ui.TextLine, pos = (9, 5))
- self.whatText.SetPackedFontColor(0xFFFFFFFF)
- # making datetime
- self.datetimeText = self.CreateWidget(ui.TextLine, pos = (405-11, 5))
- self.datetimeText.SetPackedFontColor(0xFFFFFFFF)
- self.datetimeText.SetHorizontalAlignCenter()
- def Setup(self, data):
- def GetItemName(what):
- if what == 0:
- return ""
- item.SelectItem(what)
- return item.GetItemName()
- def extractPriceString(format):
- if ENABLE_CHEQUE_SYSTEM:
- s = format.split("|")
- money = long(s[0])
- cheque = long(s[1]) if len(s) > 1 else 0
- price = ""
- if money != 0:
- price += locale.NumberToMoneyString(money)
- if cheque != 0:
- if price:
- price += ', '
- price += locale.NumberToCheque(cheque)
- return price
- return locale.NumberToMoneyString(long(format))
- self.data = data
- itemname = GetItemName(data['what'])
- if data['type'] == ikashop.NOTIFICATION_SELLER_SELLER_SOLD_ITEM:
- price = extractPriceString(data['format'])
- message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_SOLD_ITEM.format(itemname, price)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_SELLER_NEW_OFFER_ON_ITEM:
- message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_NEW_OFFER_ON_ITEM.format(itemname)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_SELLER_SHOP_EXPIRED:
- message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_SHOP_EXPIRED
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_SELLER_ITEM_EXPIRED:
- message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_ITEM_EXPIRED.format(itemname)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_SELLER_AUCTION_NEW_OFFER:
- message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_AUCTION_NEW_OFFER.format(itemname)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_SELLER_AUCTION_EXPIRED:
- message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_AUCTION_EXPIRED.format(itemname)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_SELLER_AUCTION_SOLD:
- price = long(data['format'])
- message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_AUCTION_SOLD.format(itemname, data['who'], locale.NumberToMoneyString(price))
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_SELLER_OFFER_CANCELLED:
- message = locale.IKASHOP_PRO_NOTIFICATION_SELLER_OFFER_CANCELLED.format(itemname)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_BUYER_OFFER_DENIED:
- price = long(data['format'])
- message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_OFFER_DENIED.format(locale.NumberToMoneyString(price), itemname)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_BUYER_OFFER_ACCEPTED:
- price = long(data['format'])
- message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_OFFER_ACCEPTED.format(locale.NumberToMoneyString(price), itemname)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_BUYER_OFFER_EXPIRED:
- price = long(data['format'])
- message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_OFFER_EXPIRED.format(locale.NumberToMoneyString(price), itemname)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_BUYER_AUCTION_BUY:
- price = long(data['format'])
- message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_AUCTION_BUY.format(itemname, locale.NumberToMoneyString(price))
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_BUYER_AUCTION_RAISE:
- message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_AUCTION_RAISE.format(data['who'], itemname)
- self.whatText.SetText(message)
- elif data['type'] == ikashop.NOTIFICATION_BUYER_AUCTION_LOST:
- price = long(data['format'])
- message = locale.IKASHOP_PRO_NOTIFICATION_BUYER_AUCTION_LOST.format(data['who'], itemname, locale.NumberToMoneyString(price))
- self.whatText.SetText(message)
- if app.EXTEND_IKASHOP_ULTIMATE:
- if data['type'] == ikashop.NOTIFICATION_SELLER_DECORATION_EXPIRED:
- self.whatText.SetText(locale.IKASHOP_ULTIMATE_NOTIFICATION_SELLER_DECORATION_EXPIRED)
- self.datetimeText.SetText(DatetimeFormat(data['datetime']))
- self.ShowExclamationMark() if not data['seen']\
- else self.HideExclamationMark()
- class IkarusShopNotificationBoard(IkarusShopListBoard):
- NOTIFICATION_VIEW_COUNT = 10
- def __init__(self):
- super(IkarusShopNotificationBoard, self).__init__()
- ikashop.LoadNotifications()
- self._SettingUpBoard()
- self._LoadIkarusShopNotificationBoard()
- def _SettingUpBoard(self):
- self.SetSize(494, 330)
- self.SetTitleName(locale.IKASHOP_PRO_NOTIFICATION_BOARD_TITLE)
- super(IkarusShopNotificationBoard, self)._SettingUpBoard()
- def _LoadIkarusShopNotificationBoard(self):
- self._LoadIkarusShopListBoard()
- self._MakeListElements(IkarusShopNotificationView, self.NOTIFICATION_VIEW_COUNT)
- def SetNotifications(self, notifications):
- cached = ikashop.GetNotifications()
- for i, notification in enumerate(notifications):
- type = notification['type']
- who = notification['who']
- what = notification['what']
- format = notification['format']
- datetime = notification['datetime']
- save = i == len(notifications)-1
- ikashop.RegisterNotification(type, who, what, format, datetime, save)
- notifications = cached + notifications
- self.notifications = sorted(notifications, key = lambda val : val['datetime'], reverse=True)
- self.SetElements(self.notifications)
- self.Show()
- self.SetTop()
- def Open(self):
- ikashop.SendNotificationListRequest()
- def Close(self):
- self.Hide()
- ikashop.SendNotificationListClose()
- class IkarusShopCounter(IkarusShopWindow):
- def __init__(self):
- super(IkarusShopCounter, self).__init__()
- self._LoadIkarusShopCounter()
- def _LoadIkarusShopCounter(self):
- self.background = self.CreateWidget(ui.ImageBox)
- self.background.LoadImage("ikashop/lite/business/counter.png")
- self.counter = self.CreateWidget(ui.TextLine)
- self.counter.SetOutline(1)
- self.counter.SetPackedFontColor(0xFFFFFFFF)
- self.counter.SetPosition(self.background.GetWidth()/2, self.background.GetHeight()/2 - 1)
- self.counter.SetHorizontalAlignCenter()
- self.counter.SetVerticalAlignCenter()
- def SetCounter(self, count):
- if count == 0:
- self.Hide()
- else:
- self.counter.SetText(str(count) if count <= 9 else "9+")
- self.Show()
- class IkarusShopBusinessBoard(IkashopBoardWithTitleBar):
- GRID_COLUMNS = ikashop.SHOP_GRID_WIDTH
- GRID_ROWS = ikashop.SHOP_GRID_HEIGHT
- PAGE_SIZE = GRID_COLUMNS * GRID_ROWS
- if app.EXTEND_IKASHOP_ULTIMATE:
- PAGE_COUNT = 3
- def __init__(self):
- super(IkarusShopBusinessBoard, self).__init__()
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.selectedPage = 0
- if app.EXTEND_IKASHOP_PRO:
- self.editedMarkedInfo = None
- self.editedMarkedTime = None
- self.editedMarkedColor = None
- self.removingItemList = []
- self._SettingUpBoard()
- self._LoadLinkedBoards()
- self._LoadShopBusinessWindow()
- ikashop.SetBusinessBoard(self)
- def __del__(self):
- super(IkarusShopBusinessBoard, self).__del__()
- ikashop.SetBusinessBoard(None)
- def _SettingUpBoard(self):
- self.SetSize(558, 404)
- self.SetTitleName(locale.IKASHOP_BUSINESS_BOARD_TITLE)
- self.SetCloseEvent(self.Close)
- self.SetCenterPosition()
- self.AddFlag("movable")
- self.AddFlag("float")
- def _LoadShopBusinessWindow(self):
- # making slot box
- self.slotBox = self.CreateWidget(ui.ImageBox, pos = (55,35 + 27))
- self.slotBox.LoadImage("ikashop/lite/business/slot_box.png")
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.slotBox.SetMouseWheelEvent(self._OnScrollMouseWheel)
- self.slotWindow = self.CreateWidget(ui.GridSlotWindow, parent = self.slotBox, pos = (6,6))
- self.slotWindow.ArrangeSlot(0, self.GRID_COLUMNS, self.GRID_ROWS, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slotWindow.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slotWindow.SetSelectEmptySlotEvent(self._OnClickEmptySlot)
- self.slotWindow.SetSelectItemSlotEvent(self._OnClickItemSlot)
- self.slotWindow.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
- self.slotWindow.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
- self.slotWindow.SetUnselectItemSlotEvent(self._OnRightClickItemSlot)
- # making duration box
- self.durationBox = self.CreateWidget(ui.ImageBox, pos = (55,35))
- self.durationBox.LoadImage("ikashop/lite/business/duration_box.png")
- self.durationText = self.CreateWidget(ui.TextLine, parent = self.durationBox, pos = (30, 4))
- self.durationText.SetPackedFontColor(0xFFFFFFFF)
- self.durationText.SetText("11d 22h 18m")
- self.durationExpiredIcon = self.CreateWidget(ui.ImageBox, pos = (168 - 49, 3), parent = self.durationBox)
- self.durationExpiredIcon.LoadImage("ikashop/lite/business/expired_icon.png")
- self.durationIncreaseButton = self.CreateWidget(ui.Button, parent = self.durationBox, pos = (189 - 49, 3))
- self.durationIncreaseButton.SetUpVisual("ikashop/lite/business/buttons/duration_up/default.png")
- self.durationIncreaseButton.SetDownVisual("ikashop/lite/business/buttons/duration_up/default.png")
- self.durationIncreaseButton.SetOverVisual("ikashop/lite/business/buttons/duration_up/hover.png")
- self.durationIncreaseButton.SetToolTipText(locale.IKASHOP_BUSINESS_DURATION_INCREASE_BUTTON_TEXT)
- self.durationIncreaseButton.SetEvent(self._OnClickDurationIncreaseButton)
- self.durationIncreaseButton.ToolTipText.SetOutline(1)
- # making bottom bar buttons
- self.cancelShopButton = self.CreateWidget(ui.Button, pos = (604 - 92, 35))
- self.cancelShopButton.SetUpVisual("ikashop/lite/business/buttons/cancel_shop/default.png")
- self.cancelShopButton.SetDownVisual("ikashop/lite/business/buttons/cancel_shop/default.png")
- self.cancelShopButton.SetOverVisual("ikashop/lite/business/buttons/cancel_shop/hover.png")
- self.cancelShopButton.SetToolTipText(locale.IKASHOP_BUSINESS_CANCEL_SHOP_BUTTON_TEXT)
- self.cancelShopButton.SAFE_SetEvent(self._OnClickCancelShopButton)
- self.cancelShopButton.ToolTipText.SetOutline(1)
- if app.EXTEND_IKASHOP_PRO:
- self.moveShopButton = self.CreateWidget(ui.Button, pos = (604 - 95 - self.cancelShopButton.GetWidth(), 35))
- self.moveShopButton.SetUpVisual("ikashop/lite/business/buttons/move_shop/default.png")
- self.moveShopButton.SetDownVisual("ikashop/lite/business/buttons/move_shop/default.png")
- self.moveShopButton.SetOverVisual("ikashop/lite/business/buttons/move_shop/hover.png")
- self.moveShopButton.SetToolTipText(locale.IKASHOP_PRO_BUSINESS_MOVE_SHOP_BUTTON_TEXT)
- self.moveShopButton.SAFE_SetEvent(self._OnClickMoveShopButton)
- self.moveShopButton.ToolTipText.SetOutline(1)
- # making sidebar buttons
- self.safeboxOpenButton = self.CreateWidget(ui.Button, pos = (7, 37))
- self.safeboxOpenButton.SetUpVisual("ikashop/lite/business/buttons/safebox/default.png")
- self.safeboxOpenButton.SetDownVisual("ikashop/lite/business/buttons/safebox/default.png")
- self.safeboxOpenButton.SetOverVisual("ikashop/lite/business/buttons/safebox/hover.png")
- self.safeboxOpenButton.SAFE_SetEvent(self.safeboxBoard.Toggle)
- self.safeboxOpenButton.SetToolTipText(locale.IKASHOP_BUSINESS_SAFEBOX_OPEN_BUTTON_TEXT)
- self.safeboxOpenButton.ToolTipText.SetOutline(1)
- self.privateOfferOpenButton = self.CreateWidget(ui.Button, pos = (7, 37 + 33))
- self.privateOfferOpenButton.SetUpVisual("ikashop/lite/business/buttons/offer/default.png")
- self.privateOfferOpenButton.SetDownVisual("ikashop/lite/business/buttons/offer/default.png")
- self.privateOfferOpenButton.SetOverVisual("ikashop/lite/business/buttons/offer/hover.png")
- self.privateOfferOpenButton.SAFE_SetEvent(self.offersBoard.Toggle)
- self.privateOfferOpenButton.SetToolTipText(locale.IKASHOP_BUSINESS_PRIVATE_OFFER_OPEN_BUTTON_TEXT)
- self.privateOfferOpenButton.ToolTipText.SetOutline(1)
- self.auctionOpenButton = self.CreateWidget(ui.Button, pos = (7, 37 + 33*2))
- self.auctionOpenButton.SetUpVisual("ikashop/lite/business/buttons/auction/default.png")
- self.auctionOpenButton.SetDownVisual("ikashop/lite/business/buttons/auction/default.png")
- self.auctionOpenButton.SetOverVisual("ikashop/lite/business/buttons/auction/hover.png")
- self.auctionOpenButton.SAFE_SetEvent(self.auctionBoard.Toggle)
- self.auctionOpenButton.SetToolTipText(locale.IKASHOP_BUSINESS_AUCTION_OPEN_BUTTON_TEXT)
- self.auctionOpenButton.ToolTipText.SetOutline(1)
- self.safeboxItemCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.safeboxOpenButton)
- self.privateOfferCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.privateOfferOpenButton)
- self.auctionOfferCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.auctionOpenButton)
- if app.EXTEND_IKASHOP_PRO:
- self.notificationOpenButton = self.CreateWidget(ui.Button, pos = (7, 352+12))
- self.notificationOpenButton.SetUpVisual("ikashop/pro/business/buttons/notification/default.png")
- self.notificationOpenButton.SetDownVisual("ikashop/pro/business/buttons/notification/default.png")
- self.notificationOpenButton.SetOverVisual("ikashop/pro/business/buttons/notification/hover.png")
- self.notificationOpenButton.SAFE_SetEvent(self.notificationBoard.Toggle)
- self.notificationOpenButton.SetToolTipText(locale.IKASHOP_PRO_BUSINESS_NOTIFICATION_OPEN_BUTTON_TEXT)
- self.notificationOpenButton.ToolTipText.SetOutline(1)
- self.notificationCounter = self.CreateWidget(IkarusShopCounter, pos = (25, 0), parent = self.notificationOpenButton)
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.decorationBox = self.CreateWidget(ui.ImageBox, pos = (327+19, 35))
- self.decorationBox.LoadImage("ikashop/ultimate/decoration_box.png")
- self.decorationTime = self.CreateWidget(ui.TextLine, pos = (28, 5), parent = self.decorationBox)
- self.decorationTime.SetPackedFontColor(0xFFFFFFFF)
- self.lockedCells = []
- for i in xrange(self.PAGE_SIZE):
- col, row = i % self.GRID_COLUMNS, i // self.GRID_COLUMNS
- lock = self.CreateWidget(ui.ImageBox, pos = (6 + 32*col,6 + 32*row), parent = self.slotBox, show = 0)
- lock.LoadImage("ikashop/ultimate/lock_slot.png")
- self.lockedCells.append(lock)
- # making page selection box
- self.selectPageButtons = []
- for i in xrange(self.PAGE_COUNT):
- selectPageButton = self.CreateWidget(ui.Button, pos = (269 - 48 + i*41, 35))
- selectPageButton.SetUpVisual("ikashop/lite/safebox/buttons/select_page/default.png")
- selectPageButton.SetDownVisual("ikashop/lite/safebox/buttons/select_page/default.png")
- selectPageButton.SetOverVisual("ikashop/lite/safebox/buttons/select_page/hover.png")
- selectPageButton.SetDisableVisual("ikashop/lite/safebox/buttons/select_page/disabled.png")
- selectPageButton.SetText(RomeNumber(i+1))
- selectPageButton.SAFE_SetEvent(self._OnSelectPage, i)
- self.selectPageButtons.append(selectPageButton)
- def _LoadLinkedBoards(self):
- self.safeboxBoard = IkarusShopSafeboxBoard()
- self.auctionBoard = IkarusShopAuctionOwnerBoard()
- self.offersBoard = IkarusShopOffersBoard()
- if app.EXTEND_IKASHOP_PRO:
- self.notificationBoard = IkarusShopNotificationBoard()
- # HANDLING DURATION RESTORE PROCESS
- def _OnClickDurationIncreaseButton(self):
- # checking cash
- if player.GetElk() < RESTORE_DURATION_COST:
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INCREASE_DURATION_NO_MONEY)
- return
- # opening question
- question = locale.IKASHOP_BUSINESS_INCREASE_DURATION_QUESTION.format(locale.NumberToMoneyString(RESTORE_DURATION_COST))
- self.OpenQuestionDialog(question, self._OnIncreaseDurationQuestionAccept)
- def _OnIncreaseDurationQuestionAccept(self):
- ikashop.SendShopCreate()
- self.questionDialog.Hide()
- # HANDLING INSERT ITEM PROCESS
- def _OnClickEmptySlot(self, slot):
- if app.EXTEND_IKASHOP_ULTIMATE:
- slot = self._LocalToGlobalSlot(slot)
- if mouse.mouseController.isAttached():
- attachedType = mouse.mouseController.GetAttachedType()
- attachedItemIndex = mouse.mouseController.GetAttachedItemIndex()
- attachedItemSlotPos = mouse.mouseController.GetAttachedSlotNumber()
- mouse.mouseController.DeattachObject()
- if app.EXTEND_IKASHOP_ULTIMATE:
- if attachedType == player.SLOT_TYPE_OFFLINESHOP:
- ikashop.SendShopMoveItem(attachedItemSlotPos, slot)
- return
- # validating attached item
- if attachedType in (player.SLOT_TYPE_DRAGON_SOUL_INVENTORY, player.SLOT_TYPE_INVENTORY):
- win, pos = player.SlotTypeToInvenType(attachedType), attachedItemSlotPos
- if player.ITEM_MONEY != attachedItemIndex:
- self.InsertItemInSlot(win, pos, slot)
- def InsertItemInSlot(self, win, pos, slot = None):
- # checking shop isn't expired
- if self.shopInfo['duration'] <= 0:
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM_EXPIRED_SHOP)
- return
- # checking item antiflags
- itemIndex = player.GetItemIndex(win, pos)
- itemCount = player.GetItemCount(win, pos)
- if itemIndex != 0:
- item.SelectItem(itemIndex)
- # checking item antifalg
- if item.IsAntiFlag(item.ANTIFLAG_GIVE) or item.IsAntiFlag(item.ANTIFLAG_MYSHOP):
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM)
- return
- # autodetecting price
- if app.EXTEND_IKASHOP_PRO:
- itemHash = GetInventoryItemHash(win, pos)
- detectedPrice = ikashop.GetItemPriceCache(itemIndex, itemHash, itemCount)
- isFastCall = slot == None # <- slot is None while calling it from inventory
- # autodetecting empty slot
- items = [(sitem['vnum'], sitem['cell']) for sitem in self.shopInfo['items'].values()]
- if slot == None:
- slot = ikashop.GetFirstEmptyCell(item.GetItemSize()[1], items)
- # checking for busy space
- if slot == None:
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_CANNOT_SELL_ITEM_NO_SPACE)
- # checking shop space
- else:
- if app.EXTEND_IKASHOP_ULTIMATE:
- if not ikashop.CheckShopSpace(items, itemIndex, slot, self.shopInfo['lock']):
- return
- else:
- if not ikashop.CheckShopSpace(items, itemIndex, slot):
- return
- # caching inserting item info
- self.insertingPriceInfo = slot, win, pos
- if app.EXTEND_IKASHOP_PRO:
- # checking price is already available
- if isFastCall and detectedPrice:
- price = detectedPrice['value'],
- if ENABLE_CHEQUE_SYSTEM:
- price += detectedPrice['cheque'],
- ikashop.SendAddItem(win, pos, slot, *price)
- return
- # opening money input dialog
- kargs = detectedPrice if detectedPrice else {}
- self.priceCacheInfo = itemIndex, itemHash, itemCount
- self.OpenMoneyInputDialog(self._OnAcceptInsertingItemPrice, **kargs)
- else:
- self.OpenMoneyInputDialog(self._OnAcceptInsertingItemPrice)
- if app.EXTEND_IKASHOP_ULTIMATE:
- ikashop.SendPriceAverageRequest(itemIndex, itemCount)
- self.moneyInputDialog.SetPriceAverage(-1)
- def _OnAcceptInsertingItemPrice(self):
- self.moneyInputDialog.SoftClose()
- ok, price = ExtractInputPrice(self.moneyInputDialog)
- if not ok:
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
- return
- # sending add item
- dest, win, slot = self.insertingPriceInfo
- ikashop.SendAddItem(win, slot, dest, *price)
- if app.EXTEND_IKASHOP_PRO:
- # registering item price into price cache
- vnum, hash, count = self.priceCacheInfo
- ikashop.RegisterItemPriceCache(vnum, hash, count, *price)
- return True
- # HANDLING EDIT PRICE/ REMOVE ITEM
- def _OnClickItemSlot(self, slot):
- if app.EXTEND_IKASHOP_ULTIMATE:
- if mouse.mouseController.isAttached():
- return
- slot = self._LocalToGlobalSlot(slot)
- # checking item does exists
- if slot in self.shopInfo['items']:
- data = self.shopInfo['items'][slot]
- # checking for edit item request
- if IsPressingSHIFT():
- self.insertingPriceInfo = data
- if app.EXTEND_IKASHOP_PRO:
- self.insertingPriceAllSimilar = False
- detectPrice = ikashop.GetItemPriceCache(data['vnum'], data['hash'], data['count'])
- kargs = detectPrice if detectPrice else {}
- self.OpenMoneyInputDialog(self._OnAcceptEditingItemPrice, **kargs)
- else:
- self.OpenMoneyInputDialog(self._OnAcceptEditingItemPrice)
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.moneyInputDialog.SetPriceAverage(data['priceavg'])
- return
- if app.EXTEND_IKASHOP_PRO:
- # checking for edit all similar items
- if IsPressingCTRL():
- self.insertingPriceInfo = data
- self.insertingPriceAllSimilar = True
- detectPrice = ikashop.GetItemPriceCache(data['vnum'], data['hash'], data['count'])
- kargs = detectPrice if detectPrice else {}
- self.OpenMoneyInputDialog(self._OnAcceptEditingItemPrice, **kargs)
- self.SetEditedMarkedSlotInfo(data['vnum'], data['count'], data['hash'], (0.7, 0.7, 0.7), infinite=1)
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.moneyInputDialog.SetPriceAverage(data['priceavg'])
- return
- if app.EXTEND_IKASHOP_ULTIMATE:
- # attaching the item
- mouse.mouseController.AttachObject(self, player.SLOT_TYPE_OFFLINESHOP, slot, data['vnum'], data['count'])
- def _OnRightClickItemSlot(self, slot):
- if app.EXTEND_IKASHOP_ULTIMATE:
- slot = self._LocalToGlobalSlot(slot)
- if mouse.mouseController.isAttached():
- return
- # checking item does exists
- if slot in self.shopInfo['items']:
- data = self.shopInfo['items'][slot]
- # checking for remove all similar items
- if app.EXTEND_IKASHOP_PRO:
- if IsPressingCTRL():
- self.removingVnum = data['vnum']
- item.SelectItem(self.removingVnum)
- question = locale.IKASHOP_PRO_BUSINESS_REMOVE_ALL_SIMILAR_ITEMS_QUESTION.format(item.GetItemName())
- self.OpenQuestionDialog(question, self._OnAcceptRemoveAllSimilarItems)
- # marking all removing items
- for slot, data in self.shopInfo['items'].items():
- if data['vnum'] == self.removingVnum:
- self.AppendRemovingItemSlot(slot)
- self._RefreshItems()
- return
- # starting edit item price process
- ikashop.SendRemoveItem(data['id'])
- def _OnAcceptRemoveAllSimilarItems(self):
- self.questionDialog.Hide()
- for item in self.shopInfo['items'].values():
- if item['vnum'] == self.removingVnum:
- ikashop.SendRemoveItem(item['id'])
- def _OnAcceptEditingItemPrice(self):
- self.moneyInputDialog.SoftClose()
- ok, price = ExtractInputPrice(self.moneyInputDialog)
- if not ok:
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
- return
- # sending edit item
- data = self.insertingPriceInfo
- if app.EXTEND_IKASHOP_PRO:
- # registering price into price cache
- ikashop.RegisterItemPriceCache(data['vnum'], data['hash'], data['count'], *price)
- # editing all item prices
- if self.insertingPriceAllSimilar:
- for checkData in self.shopInfo['items'].values():
- if data['hash'] == checkData['hash'] and data['count'] == checkData['count'] and data['vnum'] == checkData['vnum']:
- if price[0] != checkData['price'] or (ENABLE_CHEQUE_SYSTEM and price[1] != checkData['cheque']):
- ikashop.SendEditItem(checkData['id'], *price)
- self.SetEditedMarkedSlotInfo(data['vnum'], data['count'], data['hash'], (0.5, 0.5, 0.1), price = price)
- else:
- ikashop.SendEditItem(data['id'], *price)
- else:
- ikashop.SendEditItem(data['id'], *price)
- return True
- # HANDLING TOOLTIP OVER IN OVER OUT
- def _ShowToolTipOnItemSlot(self, slot):
- if app.EXTEND_IKASHOP_ULTIMATE:
- slot = self._LocalToGlobalSlot(slot)
- if slot in self.shopInfo['items']:
- data = self.shopInfo['items'][slot]
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
- if 'price' in data and data['price'] != 0:
- tooltip.AppendPrice(data['price'])
- if 'cheque' in data and data['cheque'] != 0:
- tooltip.AppendCheque(data['cheque'])
- if app.EXTEND_IKASHOP_ULTIMATE:
- tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
- else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
- # checking shop isn't expired
- tooltip.AppendTextLine(locale.IKASHOP_BUSINESS_EDIT_ITEM_TOOLTIP)
- if app.EXTEND_IKASHOP_PRO:
- tooltip.AppendTextLine(locale.IKASHOP_PRO_BUSINESS_EDIT_ALL_SIMILAR_ITEM_TOOLTIP)
- tooltip.AppendTextLine(locale.IKASHOP_BUSINESS_REMOVE_ITEM_TOOLTIP)
- if app.EXTEND_IKASHOP_PRO:
- tooltip.AppendTextLine(locale.IKASHOP_PRO_BUSINESS_REMOVE_ALL_SIMILAR_ITEM_TOOLTIP)
- tooltip.ShowToolTip()
- def _HideToolTipOnItemSlot(self, slot=0):
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.HideToolTip()
- # HANDLING CANCEL SHOP REQUEST
- def _OnClickCancelShopButton(self):
- self.OpenQuestionDialog(locale.IKASHOP_BUSINESS_CANCEL_SHOP_QUESTION, self._OnAcceptCancelShopQuestion)
- def _OnAcceptCancelShopQuestion(self):
- self.questionDialog.Hide()
- ikashop.SendForceCloseShop()
- if app.EXTEND_IKASHOP_PRO:
- # HANDLING MOVE SHOP REQUEST
- def _OnClickMoveShopButton(self):
- # checking money
- if player.GetElk() < MOVE_SHOP_ENTITY_COST:
- self.OpenPopupDialog(locale.IKASHOP_PRO_BUSINESS_MOVE_SHOP_NO_MONEY)
- return
- # sending question
- message = locale.IKASHOP_PRO_BUSINESS_MOVE_SHOP_QUESTION.format(locale.NumberToMoneyString(MOVE_SHOP_ENTITY_COST))
- self.OpenQuestionDialog(message, self._OnAcceptMoveShopQuestion)
- def _OnAcceptMoveShopQuestion(self):
- self.questionDialog.Hide()
- ikashop.SendMoveShopEntity()
- # HANDLING AUCTION CREATION
- def _OnAcceptCreateAuctionQuestion(self):
- self.questionDialog.Hide()
- if not hasattr(self, "createAuctionDialog"):
- self.createAuctionDialog = IkarusCreateAuctionDialog()
- self._RegisterDialog(self.createAuctionDialog)
- self.createAuctionDialog.Open()
- if app.EXTEND_IKASHOP_ULTIMATE:
- def _LocalToGlobalSlot(self, pos):
- return self.selectedPage * self.PAGE_SIZE + pos
- def _GlobalToLocalSlot(self, pos):
- return pos % self.PAGE_SIZE
- def _RefreshItems(self):
- # resetting slots
- for i in xrange(self.GRID_COLUMNS*self.GRID_ROWS):
- self.slotWindow.ClearSlot(i)
- if app.EXTEND_IKASHOP_PRO:
- self.slotWindow.DeactivateSlot(i)
- if app.EXTEND_IKASHOP_ULTIMATE:
- for i in xrange(self.PAGE_SIZE):
- self.lockedCells[i].Hide()
- scell = self.PAGE_SIZE * self.selectedPage
- ecell = scell + self.PAGE_SIZE
- for cell in xrange(scell, ecell):
- if cell >= self.shopInfo['lock']:
- self.lockedCells[self._GlobalToLocalSlot(cell)].Show()
- for cell in xrange(scell, ecell):
- if cell in self.shopInfo['items']:
- item = self.shopInfo['items'][cell]
- pos = self._GlobalToLocalSlot(cell)
- self.slotWindow.SetItemSlot(pos, item['vnum'], item['count'] if item['count'] > 1 else 0)
- else:
- # setting up slots
- for item in self.shopInfo['items'].values():
- self.slotWindow.SetItemSlot(item['cell'], item['vnum'], item['count'] if item['count'] > 1 else 0)
- if app.EXTEND_IKASHOP_PRO:
- self._RefreshMarkedSlots()
- self.slotWindow.RefreshSlot()
- if app.EXTEND_IKASHOP_PRO:
- def _RefreshMarkedSlots(self):
- # marking edited items
- actualTime = app.GetTime()
- if self.editedMarkedInfo != None and self.editedMarkedTime != None:
- if self.editedMarkedTime > actualTime or self.editedMarkedTime == -1:
- vnum, count, hash, price = self.editedMarkedInfo
- for i in xrange(self.PAGE_SIZE):
- slot = i
- if app.EXTEND_IKASHOP_ULTIMATE:
- slot = self._LocalToGlobalSlot(i)
- if slot in self.shopInfo['items']:
- data = self.shopInfo['items'][slot]
- if (data['vnum'], data['count'], data['hash']) == (vnum, count, hash):
- if ENABLE_CHEQUE_SYSTEM:
- itemPrice = (data['price'], data['cheque'])
- else:
- itemPrice = data['price'],
- if price is None or itemPrice == price:
- self.slotWindow.ActivateSlot(i, *self.editedMarkedColor)
- # marking removing items
- if app.EXTEND_IKASHOP_ULTIMATE:
- shownCellStart = self.selectedPage * self.PAGE_SIZE
- shownCellEnd = shownCellStart + self.PAGE_SIZE
- for slot in self.removingItemList:
- if slot >= shownCellStart and slot < shownCellEnd:
- local = self._GlobalToLocalSlot(slot)
- self.slotWindow.ActivateSlot(local, 0.5, 0.1, 0.1)
- else:
- for slot in self.removingItemList:
- self.slotWindow.ActivateSlot(slot, 0.5, 0.1, 0.1)
- # PUBLIC INTERFACE
- def Open(self):
- ikashop.SendOpenShopOwner()
- if app.EXTEND_IKASHOP_PRO:
- player.RefreshInventory()
- def Close(self):
- self.Hide()
- ikashop.SendCloseMyShopBoard()
- if app.EXTEND_IKASHOP_PRO:
- player.RefreshInventory()
- if app.EXTEND_IKASHOP_PRO:
- def AppendRemovingItemSlot(self, slot):
- if not slot in self.removingItemList:
- self.removingItemList.append(slot)
- def SetEditedMarkedSlotInfo(self, vnum, count, hash, color, infinite = 0, price = None):
- self.editedMarkedInfo = vnum, count, hash, price
- self.editedMarkedTime = app.GetTime() + 20.0 if not infinite else -1
- self.editedMarkedColor = color
- self._RefreshItems()
- def OnUpdate(self):
- # checking for edited item list
- if self.editedMarkedTime != None and self.editedMarkedTime != -1 and self.editedMarkedTime < app.GetTime():
- self.editedMarkedTime = None
- self.editedMarkedInfo = None
- self._RefreshItems()
- # checking for closed money input dialog
- if self.editedMarkedInfo != None and self.editedMarkedTime == -1 and not self.moneyInputDialog.IsShow():
- self.editedMarkedTime = None
- self.editedMarkedInfo = None
- self._RefreshItems()
- # checking for removing item list
- if self.removingItemList:
- if not self.questionDialog.IsShow():
- self.removingItemList = []
- self._RefreshItems()
- def IsCreatingAuction(self):
- return hasattr(self, "createAuctionDialog") and self.createAuctionDialog.IsShow()
- # BINARY CALLS
- def OpenShopOwner(self, data):
- # refreshing duration
- if data['duration'] > 0:
- self.durationText.SetText(locale.SecondToDHM(data['duration']*60))
- self.durationExpiredIcon.Hide()
- if not app.EXTEND_IKASHOP_ULTIMATE:
- self.durationIncreaseButton.Hide()
- else:
- self.durationText.SetText(locale.IKASHOP_BUSINESS_SHOP_EXPIRED_DURATION)
- self.durationExpiredIcon.Show()
- self.durationIncreaseButton.Show()
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.decorationBox.Show() if data['decoration'] != 0\
- else self.decorationBox.Hide()
- self.decorationTime.SetText(locale.SecondToDHM(data['decoration_time']*60))
- # ordering items by cell and storing info
- data['items'] = { item['cell'] : item for item in data['items'] }
- self.shopInfo = data
- self._RefreshItems()
- if not self.IsShow():
- self.Show()
- self.SetTop()
- if app.EXTEND_IKASHOP_ULTIMATE:
- self._OnSelectPage(0)
- if app.EXTEND_IKASHOP_PRO:
- player.RefreshInventory()
- def OpenShopOwnerEmpty(self):
- # refreshing duration
- self.durationText.SetText(locale.IKASHOP_BUSINESS_SHOP_EXPIRED_DURATION)
- self.durationExpiredIcon.Show()
- self.durationIncreaseButton.Show()
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.decorationBox.Hide()
- # resetting slots
- for i in xrange(self.GRID_COLUMNS*self.GRID_ROWS):
- self.slotWindow.ClearSlot(i)
- self.slotWindow.RefreshSlot()
- # making shop info data
- self.shopInfo = {'duration' : 0, 'items' : {}}
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.shopInfo['lock'] = ikashop.OFFSHOP_LOCK_INDEX_INIT
- if not self.IsShow():
- self.Show()
- self.SetTop()
- if app.EXTEND_IKASHOP_ULTIMATE:
- self._OnSelectPage(0)
- if app.EXTEND_IKASHOP_PRO:
- player.RefreshInventory()
- def ShopOwnerRemoveItem(self, itemid):
- if 'items' in self.shopInfo:
- self.shopInfo['items'] = {cell:item for cell,item in self.shopInfo['items'].items() if item['id'] != itemid}
- self._RefreshItems()
- def ShopOwnerEditItem(self, itemid, prices):
- if 'items' in self.shopInfo:
- for data in self.shopInfo['items'].values():
- if data['id'] == itemid:
- data['price'] = prices['price']
- if prices.has_key('cheque'):
- data['cheque'] = prices['cheque']
- self._RefreshItems()
- break
- def SetupSafebox(self, yang, items):
- self.safeboxBoard.Setup(yang, items)
- def SafeboxRemoveItem(self, itemid):
- self.safeboxBoard.RemoveItem(itemid)
- def SafeboxAddItem(self, item):
- self.safeboxBoard.AddItem(item)
- def SetupAcutionOwner(self, data):
- self.auctionBoard.Setup(data)
- def OpenCreateAuctionQuestion(self):
- question = locale.IKASHOP_BUSINESS_NO_AUCTION_CREATE_AUCTION_QUESTION
- self.OpenQuestionDialog(question, self._OnAcceptCreateAuctionQuestion)
- def AuctionInsertItemInSlot(self, win, pos):
- self.createAuctionDialog.InsertItemInSlot(win, pos)
- def SetOffers(self, offers):
- self.offersBoard.SetOffers(offers)
- def SetSafeboxCounter(self, count):
- self.safeboxItemCounter.SetCounter(count)
- def SetAuctionCounter(self, count):
- self.auctionOfferCounter.SetCounter(count)
- def SetOffersCounter(self, count):
- self.privateOfferCounter.SetCounter(count)
- if app.EXTEND_IKASHOP_PRO:
- def SetNotificationCounter(self, count):
- self.notificationCounter.SetCounter(count)
- def SetNotifications(self, notifications):
- self.notificationBoard.SetNotifications(notifications)
- if app.EXTEND_IKASHOP_ULTIMATE:
- def SetPriceAverage(self, price):
- if hasattr(self, "moneyInputDialog"):
- self.moneyInputDialog.SetPriceAverage(price)
- if hasattr(self, "createAuctionDialog"):
- if hasattr(self.createAuctionDialog, "moneyInputDialog"):
- self.createAuctionDialog.moneyInputDialog.SetPriceAverage(price)
- def _OnSelectPage(self, page):
- self.selectedPage = page
- for idx, button in enumerate(self.selectPageButtons):
- button.Disable() if idx == page else button.Enable()
- self._RefreshItems()
- def _OnScrollMouseWheel(self, delta):
- if delta > 0:
- if self.selectedPage > 0:
- self._OnSelectPage(self.selectedPage-1)
- else:
- if self.selectedPage + 1 < self.PAGE_COUNT:
- self._OnSelectPage(self.selectedPage+1)
- return True
- def ServerPopupMessage(self, message):
- message = getattr(locale, message, message)
- self.OpenPopupDialog(message)
- class IkarusShopGuestBoard(IkashopBoardWithTitleBar):
- GRID_COLUMNS = ikashop.SHOP_GRID_WIDTH
- GRID_ROWS = ikashop.SHOP_GRID_HEIGHT
- if app.EXTEND_IKASHOP_ULTIMATE:
- PAGE_COUNT = 3
- PAGE_SIZE = GRID_COLUMNS * GRID_ROWS
- def __init__(self):
- super(IkarusShopGuestBoard, self).__init__()
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.selectedPage = 0
- self.lockImages = []
- self.markedInfo = None
- self._SettingUpBoard()
- self._LoadIkarusShopGuestBoard()
- def _SettingUpBoard(self):
- self.SetSize(508, 404)
- self.SetCloseEvent(self.Close)
- self.AddFlag("movable")
- self.AddFlag("float")
- self.SetCenterPosition()
- x,y = self.GetLocalPosition()
- self.SetPosition(x+100,y)
- def _LoadIkarusShopGuestBoard(self):
- # making slot box
- self.slotBox = self.CreateWidget(ui.ImageBox, pos = (5,35 + 27))
- self.slotBox.LoadImage("ikashop/lite/business/slot_box.png")
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.slotBox.SetMouseWheelEvent(self._OnScrollMouseWheel)
- self.slotWindow = self.CreateWidget(ui.GridSlotWindow, parent = self.slotBox, pos = (6,6))
- self.slotWindow.ArrangeSlot(0, self.GRID_COLUMNS, self.GRID_ROWS, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slotWindow.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slotWindow.SetSelectItemSlotEvent(self._OnClickItemSlot)
- self.slotWindow.SetOverInItemEvent(self._ShowToolTipOnItemSlot)
- self.slotWindow.SetOverOutItemEvent(self._HideToolTipOnItemSlot)
- # making duration box
- self.durationBox = self.CreateWidget(ui.ImageBox, pos = (5,35))
- self.durationBox.LoadImage("ikashop/lite/business/duration_box.png")
- self.durationText = self.CreateWidget(ui.TextLine, parent = self.durationBox, pos = (30, 4))
- self.durationText.SetPackedFontColor(0xFFFFFFFF)
- self.durationText.SetText("11d 22h 18m")
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.lockedCells = []
- for i in xrange(self.PAGE_SIZE):
- col, row = i % self.GRID_COLUMNS, i // self.GRID_COLUMNS
- lock = self.CreateWidget(ui.ImageBox, pos = (6 + 32*col,6 + 32*row), parent = self.slotBox, show = 0)
- lock.LoadImage("ikashop/ultimate/lock_slot.png")
- self.lockedCells.append(lock)
- # making page selection box
- self.selectPageButtons = []
- for i in xrange(self.PAGE_COUNT):
- selectPageButton = self.CreateWidget(ui.Button, pos = (269 - 48 + i*41, 35))
- selectPageButton.SetUpVisual("ikashop/lite/safebox/buttons/select_page/default.png")
- selectPageButton.SetDownVisual("ikashop/lite/safebox/buttons/select_page/default.png")
- selectPageButton.SetOverVisual("ikashop/lite/safebox/buttons/select_page/hover.png")
- selectPageButton.SetDisableVisual("ikashop/lite/safebox/buttons/select_page/disabled.png")
- selectPageButton.SetText(RomeNumber(i+1))
- selectPageButton.SAFE_SetEvent(self._OnSelectPage, i)
- self.selectPageButtons.append(selectPageButton)
- def _OnClickItemSlot(self, slot):
- if app.EXTEND_IKASHOP_ULTIMATE:
- slot = self._LocalToGlobalSlot(slot)
- if slot in self.shopInfo['items']:
- data = self.shopInfo['items'][slot]
- # making item name
- item.SelectItem(data['vnum'])
- itemName = item.GetItemName()
- if data['count'] > 1:
- itemName += "({})".format(data['count'])
- # making item price
- if ENABLE_CHEQUE_SYSTEM:
- itemPrice = ""
- if data['price'] != 0:
- itemPrice += locale.NumberToMoneyString(data['price'])
- if data['cheque'] != 0:
- if itemPrice:
- itemPrice += ', '
- itemPrice += locale.NumberToCheque(data['cheque'])
- else:
- itemPrice = locale.NumberToMoneyString(data['price'])
- if app.EXTEND_IKASHOP_PRO:
- if IsPressingCTRL():
- item.SelectItem(data['vnum'])
- # making message
- message = locale.IKASHOP_PRO_SHOP_GUEST_BUY_ALL_ITEMS_QUESTION.format(itemName, itemPrice)
- self.buyAllInfo = data['vnum'], data['count'], data['price']
- self.OpenQuestionDialog(message, self._OnAcceptBuyAllQuestion)
- return
- if IsPressingSHIFT():
- # checking offer min price
- if data['price'] + data.get('cheque', 0) * YANG_PER_CHEQUE < 10000:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_MAKE_OFFER_ITEM_PRICE_TOO_LOW)
- return
- self.offerInfo = data['id'], data['price'], data.get('cheque', 0)
- self.OpenMoneyInputDialog(self._OnAcceptMakeOfferInput)
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.moneyInputDialog.SetPriceAverage(data['priceavg'])
- return
- self.buyItemInfo = self.shopInfo['id'], data['id'], data['price'] + data.get('cheque', 0) * YANG_PER_CHEQUE
- message = locale.IKASHOP_SHOP_GUEST_BUY_ITEM_QUESTION.format(itemName, itemPrice)
- self.OpenQuestionDialog(message, self._OnAcceptBuyItemQuestion)
- if app.EXTEND_IKASHOP_PRO:
- def _OnAcceptBuyAllQuestion(self):
- self.questionDialog.Hide()
- for data in self.shopInfo['items'].values():
- if (data['vnum'], data['count'], data['price']) == self.buyAllInfo:
- ikashop.SendBuyItem(self.shopInfo['id'], data['id'], data['price'] + data.get('cheque', 0) * YANG_PER_CHEQUE)
- def _OnAcceptBuyItemQuestion(self):
- ikashop.SendBuyItem(*self.buyItemInfo)
- self.questionDialog.Hide()
- def _OnAcceptMakeOfferInput(self):
- self.moneyInputDialog.SoftClose()
- # validating value
- ok, value = ExtractInputPrice(self.moneyInputDialog)
- if not ok:
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
- return
- # checking for max offer price
- id, price, cheque = self.offerInfo
- if ENABLE_CHEQUE_SYSTEM:
- valueTotal = value[0] + value[1] * YANG_PER_CHEQUE
- priceTotal = price + cheque * YANG_PER_CHEQUE
- if valueTotal >= priceTotal:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
- return True
- # checking for min offer price
- minoffer = priceTotal * MIN_OFFER_PCT / 100
- if valueTotal < minoffer:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
- return True
- # checking owned cash
- if value[0] > player.GetElk() or value[1] > player.GetCheque():
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
- return True
- else:
- if value[0] >= price:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
- return True
- # checking for min offer price
- minoffer = price * MIN_OFFER_PCT / 100
- if value[0] < minoffer:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
- return True
- # checking owned cash
- if value[0] > player.GetElk():
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
- return True
- ikashop.SendOfferCreate(self.shopInfo['id'], id, *value)
- return True
- def _ShowToolTipOnItemSlot(self, slot):
- if app.EXTEND_IKASHOP_ULTIMATE:
- slot = self._LocalToGlobalSlot(slot)
- if slot in self.shopInfo['items']:
- data = self.shopInfo['items'][slot]
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
- if 'price' in data and data['price'] != 0:
- tooltip.AppendPrice(data['price'])
- if 'cheque' in data and data['cheque'] != 0:
- tooltip.AppendCheque(data['cheque'])
- if app.EXTEND_IKASHOP_ULTIMATE:
- tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
- else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
- tooltip.AppendTextLine(locale.IKASHOP_SHOP_GUEST_BUY_ITEM_TOOLTIP)
- if app.EXTEND_IKASHOP_PRO:
- tooltip.AppendTextLine(locale.IKASHOP_PRO_SHOP_GUEST_BUY_ALL_ITEM_TOOLTIP)
- tooltip.AppendTextLine(locale.IKASHOP_SHOP_GUEST_OFFER_ITEM_TOOLTIP)
- tooltip.ShowToolTip()
- def _HideToolTipOnItemSlot(self, slot=0):
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.HideToolTip()
- if app.EXTEND_IKASHOP_ULTIMATE:
- def _OnSelectPage(self, page):
- self.selectedPage = page
- for idx, button in enumerate(self.selectPageButtons):
- button.Disable() if idx == page else button.Enable()
- self._RefreshItems()
- def _LocalToGlobalSlot(self, pos):
- return self.selectedPage * self.PAGE_SIZE + pos
- def _GlobalToLocalSlot(self, pos):
- return pos % self.PAGE_SIZE
- def _OnScrollMouseWheel(self, delta):
- if delta > 0:
- if self.selectedPage > 0:
- self._OnSelectPage(self.selectedPage-1)
- else:
- if self.selectedPage + 1 < self.PAGE_COUNT:
- self._OnSelectPage(self.selectedPage+1)
- return True
- def _RefreshItems(self):
- # resetting slots
- for i in xrange(self.GRID_COLUMNS*self.GRID_ROWS):
- self.slotWindow.ClearSlot(i)
- self.slotWindow.DeactivateSlot(i)
- if app.EXTEND_IKASHOP_ULTIMATE:
- for i in xrange(self.PAGE_SIZE):
- self.lockedCells[i].Hide()
- scell = self.PAGE_SIZE * self.selectedPage
- ecell = scell + self.PAGE_SIZE
- for cell in xrange(scell, ecell):
- if cell >= self.shopInfo['lock']:
- self.lockedCells[self._GlobalToLocalSlot(cell)].Show()
- if cell in self.shopInfo['items']:
- item = self.shopInfo['items'][cell]
- pos = self._GlobalToLocalSlot(cell)
- self.slotWindow.SetItemSlot(pos, item['vnum'], item['count'] if item['count'] > 1 else 0)
- else:
- # setting up slots
- for item in self.shopInfo['items'].values():
- self.slotWindow.SetItemSlot(item['cell'], item['vnum'], item['count'] if item['count'] > 1 else 0)
- self.slotWindow.RefreshSlot()
- self._RefreshMarkedSlots()
- def _RefreshMarkedSlots(self):
- if not self.markedInfo:
- return
- if app.EXTEND_IKASHOP_ULTIMATE:
- scell = self.PAGE_SIZE * self.selectedPage
- ecell = scell + self.PAGE_SIZE
- shownCells = xrange(scell, ecell)
- vnum, count, price = self.markedInfo
- for cell, data in self.shopInfo['items'].items():
- if app.EXTEND_IKASHOP_ULTIMATE:
- if cell not in shownCells:
- continue
- if (data['vnum'], data['count'], data['price']) == (vnum, count, price):
- self.slotWindow.ActivateSlot(cell, 0.4, 0.4, 0.1)
- self.slotWindow.RefreshSlot()
- def Open(self, data):
- # refreshing duration & title
- self.durationText.SetText(locale.SecondToDHM(data['duration']*60))
- self.SetTitleName(locale.IKASHOP_SHOP_NAME_FORMAT.format(data['name']))
- # ordering items by cell and storing info
- data['items'] = { item['cell'] : item for item in data['items'] }
- self.shopInfo = data
- self._RefreshItems()
- if not self.IsShow():
- if app.EXTEND_IKASHOP_ULTIMATE:
- self._OnSelectPage(0)
- self.Show()
- self.SetTop()
- def Close(self):
- self.Hide()
- ikashop.SendCloseShopGuestBoard()
- def MarkItems(self, vnum, count, price):
- self.markedInfo = vnum, count, price
- self._RefreshMarkedSlots()
- def CheckExpiring(self, id):
- if self.shopInfo['id'] == id:
- self.Close()
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_EXPIRED)
- def ShopGuestRemoveItem(self, itemid):
- if 'items' in self.shopInfo:
- self.shopInfo['items'] = { cell : data for cell, data in self.shopInfo['items'].items() if data['id'] != itemid}
- self._RefreshItems()
- def EditItem(self, itemid, prices):
- if 'items' in self.shopInfo:
- for data in self.shopInfo['items'].values():
- if data['id'] == itemid:
- data['price'] = prices['price']
- if 'cheque' in prices:
- data['cheque'] = prices['cheque']
- self._RefreshItems()
- break
- class IkarusAuctionGuestBoard(IkashopBoardWithTitleBar):
- OFFER_VIEW_COUNT = 6
- OFFER_VIEW_HEIGHT = 28
- def __init__(self):
- super(IkarusAuctionGuestBoard, self).__init__()
- self._SettingUpBoard()
- self._LoadIkarusShopAuctionGuestBoard()
- def _SettingUpBoard(self):
- sw, sh = GetScreenSize()
- self.SetSize(513 + 13, 249)
- self.SetCloseEvent(self.Close)
- self.SetPosition(sw/2 + self.GetWidth() - 600, sh / 2 - self.GetHeight()/2 + 100)
- self.AddFlag("movable")
- self.AddFlag("float")
- def _LoadIkarusShopAuctionGuestBoard(self):
- # making info box
- self.infoBox = self.CreateWidget(ui.ImageBox, pos = (12, 36))
- self.infoBox.LoadImage("ikashop/lite/auction/info_box.png")
- self.infoBox.SetMouseWheelEvent(self._MouseWheelScrollOffers)
- self.minRaiseText = self.CreateWidget(ui.TextLine, pos = (458+13, 221-36), parent = self.infoBox)
- self.minRaiseText.SetPackedFontColor(0xFFFFFFFF)
- self.minRaiseText.SetHorizontalAlignRight()
- self.durationText = self.CreateWidget(ui.TextLine, pos = (141, 221-36), parent = self.infoBox)
- self.durationText.SetPackedFontColor(0xFFFFFFFF)
- # making slot
- self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (36, 44), size = (32, 98), parent = self.infoBox)
- self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slot.SetOverInItemEvent(self._OverInItem)
- self.slot.SetOverOutItemEvent(self._OverOutItem)
- # making scrollbar
- self.offerScrollbar = self.CreateWidget(ui.ScrollBar, pos = (470+13, 4), parent = self.infoBox)
- self.offerScrollbar.SetScrollBarSize(self.infoBox.GetHeight() - 35)
- self.offerScrollbar.SetScrollEvent(self._ScrollOffers)
- # making cancel auction button
- self.raiseButton = self.CreateWidget(ui.Button, pos = (12, self.GetHeight() - 33))
- self.raiseButton.SetUpVisual("ikashop/lite/auction/raise_button/default.png")
- self.raiseButton.SetDownVisual("ikashop/lite/auction/raise_button/default.png")
- self.raiseButton.SetOverVisual("ikashop/lite/auction/raise_button/hover.png")
- self.raiseButton.SetText(locale.IKASHOP_ACUTION_GUEST_RAISE_AUCTION_BUTTON)
- self.raiseButton.SAFE_SetEvent(self._OnClickRaiseAuction)
- self.raiseButton.Show()
- # making offers
- self.offerViews = []
- for i in xrange(self.OFFER_VIEW_COUNT):
- self.offerViews.append(self.CreateWidget(
- IkarusShopAuctionOfferView, pos = (115, 6 + i*self.OFFER_VIEW_HEIGHT), parent = self.infoBox))
- def _RefreshOffers(self):
- # calculating count difference
- diff = len(self.offers) - self.OFFER_VIEW_COUNT
- diff = max(diff, 0)
- # calculating ranges
- offset = self.offerScrollbar.GetPos()
- sindex = int(diff * offset)
- eindex = sindex + min(self.OFFER_VIEW_COUNT, len(self.offers))
- # iterating over views
- for i, view in enumerate(self.offerViews):
- ri = i + sindex
- view.Hide() if ri >= eindex \
- else view.Setup(ri+1, self.offers[ri])
- # update scrollbar's middlebar height
- self.offerScrollbar.UpdateScrollbarLenght(self.OFFER_VIEW_HEIGHT * len(self.offers))
- def _MouseWheelScrollOffers(self, delta):
- if self.offerScrollbar.IsShow():
- self.offerScrollbar.OnDown() if delta < 0 \
- else self.offerScrollbar.OnUp()
- return True
- def _ScrollOffers(self):
- if self.offerScrollbar.IsShow():
- self._RefreshOffers()
- def _UpdateScrollbarState(self):
- self.offerScrollbar.SetPos(0)
- if len(self.offers) <= self.OFFER_VIEW_COUNT:
- self.offerScrollbar.Hide()
- else:
- self.offerScrollbar.Show()
- def _OverInItem(self, slot):
- data = self.auctionInfo
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.AddItemData(data['vnum'], data['sockets'], data['attrs'])
- if app.EXTEND_IKASHOP_ULTIMATE:
- tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE) if data['priceavg'] == 0 \
- else tooltip.AppendTextLine(locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_VALUE.format(locale.NumberToMoneyString(data['priceavg'])))
- tooltip.ShowToolTip()
- def _OverOutItem(self, slot = 0):
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.HideToolTip()
- def _OnClickRaiseAuction(self):
- self.OpenMoneyInputDialog(self._OnAcceptRaiseAuctionInput, value = self.minRaise)
- if app.EXTEND_IKASHOP_ULTIMATE:
- data = self.auctionInfo
- self.moneyInputDialog.SetPriceAverage(data['priceavg'])
- def _OnAcceptRaiseAuctionInput(self):
- self.moneyInputDialog.SoftClose()
- ok, value = ExtractInputPrice(self.moneyInputDialog)
- if not ok:
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
- return
- if ENABLE_CHEQUE_SYSTEM:
- valueTotal = value[0] + value[1] * YANG_PER_CHEQUE
- if self.minRaise > valueTotal:
- self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_MIN_RAISE_REQUIRED)
- return True
- if value[0] > player.GetElk() or value[1] > player.GetCheque():
- self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_NOT_ENOUGH_MONEY)
- return True
- else:
- if self.minRaise > value[0]:
- self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_MIN_RAISE_REQUIRED)
- return True
- if value[0] > player.GetElk():
- self.OpenPopupDialog(locale.IKASHOP_AUCTION_GUEST_NOT_ENOUGH_MONEY)
- return True
- ikashop.SendAuctionAddOffer(self.auctionInfo['owner'], *value)
- return True
- def SetOffers(self, offers):
- self.offers = sorted(offers, key = lambda val : val['datetime'], reverse=True)
- self._UpdateScrollbarState()
- self._RefreshOffers()
- self.RefreshMinRaise()
- def SetDuration(self, duration):
- self.durationText.SetText(locale.SecondToDHM(duration*60))
- def _GetMinRaise(self):
- if not self.offers:
- return self.auctionInfo['price']
- minraise = max([val['price'] for val in self.offers])
- if minraise < 1000:
- return minraise + 1000
- return minraise * (100+AUCTION_MIN_RAISE_PERCENTAGE) / 100
- def RefreshMinRaise(self):
- self.minRaise = self._GetMinRaise()
- self.minRaiseText.SetText(locale.IKASHOP_AUCTION_MIN_BID + ' ' + locale.NumberToString(self.minRaise))
- def Open(self, data):
- # storing data
- self.auctionInfo = data
- # refreshing duration & title
- seconds = data['duration'] * 60
- self.durationText.SetText(locale.SecondToDHM(seconds))
- self.SetTitleName(locale.IKASHOP_AUCTION_GUEST_NAME_FORMAT.format(data['ownername']))
- # refreshing item
- vnum = data['vnum']
- count = data['count'] if data['count'] > 1 else 0
- item.SelectItem(vnum)
- size = item.GetItemSize()[1]
- self.slot.ArrangeSlot(0, 1, size, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slot.SetItemSlot(0, vnum, count)
- # refreshing offers
- self.SetOffers(data['offers'])
- if not self.IsShow():
- self.Show()
- self.SetTop()
- def Close(self):
- self.Hide()
- ikashop.SendAuctionExitFrom(self.auctionInfo['owner'])
- class IkarusAuctionListBoard(IkarusShopListBoard):
- AUCTION_VIEW_COUNT = 4
- def __init__(self):
- super(IkarusAuctionListBoard, self).__init__()
- self._SettingUpBoard()
- self._LoadIkarusAuctionListBoard()
- def _SettingUpBoard(self):
- self.SetSize(395, 510)
- self.SetTitleName(locale.IKASHOP_AUCTION_LIST_BOARD_TITLE)
- super(IkarusAuctionListBoard, self)._SettingUpBoard()
- def _LoadIkarusAuctionListBoard(self):
- self._LoadIkarusShopListBoard()
- self._MakeListElements(IkarusSearchShopItem, self.AUCTION_VIEW_COUNT)
- def SetAuctions(self, auctions):
- shuffle(auctions)
- self.auctions = auctions
- self.SetElements(self.auctions)
- self.Show()
- self.SetTop()
- def SetSearchShopBoard(self, board):
- for view in self.views:
- view.SetSearchShopBoard(board)
- def Open(self):
- ikashop.SendAuctionListRequest()
- def Close(self):
- self.Hide()
- class IkarusShopHistoryFilterView(IkarusShopWindow):
- def __init__(self):
- super(IkarusShopHistoryFilterView, self).__init__()
- self._LoadIkarusShopHistoryFilterView()
- def _LoadIkarusShopHistoryFilterView(self):
- # making background and fitting its size
- self.background = self.CreateWidget(ui.ImageBox)
- self.background.LoadImage("ikashop/lite/history_search/box.png")
- self.SetSize(self.background.GetWidth(), self.background.GetHeight())
- # making what
- self.whatText = self.CreateWidget(ui.TextLine, pos = (9, 5))
- self.whatText.SetPackedFontColor(0xFFFFFFFF)
- # making datetime
- self.datetimeText = self.CreateWidget(ui.TextLine, pos = (405-11, 5))
- self.datetimeText.SetPackedFontColor(0xFFFFFFFF)
- self.datetimeText.SetHorizontalAlignCenter()
- # info button
- self.infoButton = self.CreateWidget(ui.Button, pos = (294, 1))
- self.infoButton.SetUpVisual("ikashop/lite/history_search/info_button/default.png")
- self.infoButton.SetDownVisual("ikashop/lite/history_search/info_button/default.png")
- self.infoButton.SetOverVisual("ikashop/lite/history_search/info_button/hover.png")
- # search button
- self.searchButton = self.CreateWidget(ui.Button, pos = (294 + 27, 1))
- self.searchButton.SetUpVisual("ikashop/lite/search_shop/mini_search_button/default.png")
- self.searchButton.SetDownVisual("ikashop/lite/search_shop/mini_search_button/default.png")
- self.searchButton.SetOverVisual("ikashop/lite/search_shop/mini_search_button/hover.png")
- self.searchButton.SetToolTipText(locale.IKASHOP_SEARCH_SHOP_SEARCH_BUTTON_TEXT)
- def _ShowToolTip(self):
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- # adding item name
- tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_HISTORY_WHAT_FORMAT.format(self.data['name'], self.data['count']))
- # adding type/subtype
- if self.data['type'] != 0:
- tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_HEADER + ': ' + IkarusSearchShopBoard.ITEM_TYPES[self.data['type']])
- if self.data['subtype'] != 0:
- subtypes = IkarusSearchShopBoard.SUB_TYPES[self.data['type']]
- tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_HEADER + ': ' + subtypes[self.data['subtype']])
- # adding price min/max
- if self.data['price_min'] != 0:
- tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MIN_HEADER + ': ' + locale.NumberToString(self.data['price_min']))
- if self.data['price_max'] != 0:
- tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MAX_HEADER + ': ' + locale.NumberToString(self.data['price_max']))
- # adding level min/max
- if self.data['level_min'] != 0:
- tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MIN_HEADER + ': ' + locale.NumberToString(self.data['level_min']))
- if self.data['level_max'] != 0:
- tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MAX_HEADER + ': ' + locale.NumberToString(self.data['level_max']))
- # adding attributes
- tooltip.AppendAttributes(self.data['attrs'])
- # adding special filters
- if self.data['sash'] != 0:
- tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_SASH_ABSORB_HEADER + ': ' + IkarusSearchShopBoard.SASH_ABSORBS[self.data['sash']])
- if self.data['alchemy'] != 0:
- tooltip.AutoAppendTextLine(locale.IKASHOP_SEARCH_SHOP_ALCHEMY_GRADE_HEADER + ': ' + IkarusSearchShopBoard.ALCHEMY_GRADES[self.data['alchemy']])
- tooltip.ResizeToolTip()
- tooltip.ShowToolTip()
- def _RefreshToolTip(self):
- tooltip = self.GetToolTip()
- if tooltip.IsShow():
- if not self.infoButton.IsIn():
- tooltip.HideToolTip()
- else:
- if self.infoButton.IsIn():
- self._ShowToolTip()
- def Setup(self, data):
- self.data = data
- self.datetimeText.SetText(DatetimeFormat(data['datetime']))
- self.whatText.SetText(locale.IKASHOP_SEARCH_SHOP_HISTORY_WHAT_FORMAT.format(data['name'], data['count']))
- def SetSearchEvent(self, event):
- self.searchButton.SAFE_SetEvent(event, proxy(self))
- def OnUpdate(self):
- self._RefreshToolTip()
- class IkarusHistoryFilterBoard(IkarusShopListBoard):
- HISTORY_FILTER_VIEW_COUNT = 10
- def __init__(self):
- super(IkarusHistoryFilterBoard, self).__init__()
- self._SettingUpBoard()
- self._LoadIkarusHistoryFilterBoard()
- def _SettingUpBoard(self):
- self.SetSize(494, 339)
- self.SetTitleName(locale.IKASHOP_HISTORY_FILTER_LIST_BOARD_TITLE)
- super(IkarusHistoryFilterBoard, self)._SettingUpBoard()
- def _LoadIkarusHistoryFilterBoard(self):
- self._LoadIkarusShopListBoard()
- self._MakeListElements(IkarusShopHistoryFilterView, self.HISTORY_FILTER_VIEW_COUNT)
- for view in self.views:
- view.SetSearchEvent(self._OnClickSearchOnHistoryElement)
- def _OnClickSearchOnHistoryElement(self, view):
- self.searchShopBoard.HistoryRedoSearch(view.data)
- self.Close()
- def SetSearchShopBoard(self, board):
- self.searchShopBoard = proxy(board)
- def SetFilters(self, filters):
- self.filters = sorted(filters, key = lambda elm : elm['datetime'], reverse=True)
- self.SetElements(self.filters)
- def Open(self):
- self.Show()
- self.SetTop()
- def Close(self):
- self.Hide()
- class IkarusShopComboBox(IkarusShopWindow):
- DEFAULT_VIEW_COUNT = 5
- ELEMENT_HEIGHT = 14
- class ComboBoxView(ui.Button):
- def Destroy(self):
- SelfDestroyObject(self)
- def __init__(self):
- super(IkarusShopComboBox, self).__init__()
- self.viewCount = self.DEFAULT_VIEW_COUNT
- self.elementWidth = 0
- self.selectItemEvent = None
- self.views = []
- self.items = []
- self.elementImages = (
- "ikashop/lite/search_shop/combo_box_element/default.png",
- "ikashop/lite/search_shop/combo_box_element/default.png",
- "ikashop/lite/search_shop/combo_box_element/hover.png")
- self.selectedItem = 0
- self._LoadIkarusShopComboBox()
- def _LoadIkarusShopComboBox(self):
- self.SetMouseWheelEvent(self._MouseWheelScrollView)
- self.background = self.CreateWidget(ui.Bar3D)
- self.background.SetColor(0xFF999999, 0xFF000000, 0xFF777777)
- self.scrollbar = self.CreateWidget(ui.ScrollBar, show = False, parent = self.background)
- self.scrollbar.SetScrollEvent(self._ScrollView)
- def _MakeViews(self):
- for view in self.views:
- SelfDestroyObject(view)
- self.views = []
- images = self.elementImages
- for i in xrange(self.viewCount):
- view = self.CreateWidget(self.ComboBoxView, pos = (0, i*self.ELEMENT_HEIGHT), parent = self.background)
- view.SetUpVisual(images[0])
- view.SetDownVisual(images[1])
- view.SetOverVisual(images[2])
- view.SetWindowName("cacca")
- self.elementWidth = max(self.elementWidth, view.GetWidth())
- self.views.append(view)
- def _MouseWheelScrollView(self, delta):
- if self.scrollbar.IsShow():
- self.scrollbar.OnDown() if delta < 0\
- else self.scrollbar.OnUp()
- return True
- def _ScrollView(self):
- if self.scrollbar.IsShow():
- self._RefreshView()
- def _RefreshView(self):
- # making view if required
- if not self.views:
- self._MakeViews()
- # calculating sindex
- pos = self.scrollbar.GetPos() if self.scrollbar.IsShow() else 0.0
- diff = max(len(self.items) - self.viewCount, 0)
- sindex = int(diff * pos)
- eindex = sindex + min(len(self.items), self.viewCount)
- # hiding all views
- for view in self.views:
- view.Hide()
- # setting up and showing only used views
- for i in xrange(sindex, eindex):
- ri = i - sindex
- view = self.views[ri]
- view.SetText(self.items[i])
- view.ButtonText.SetPosition(view.GetWidth()/2, view.GetHeight() /2 -1)
- view.SAFE_SetEvent(self.SelectItem, i)
- view.Show()
- color = 0xFFFFFFFF if i != self.selectedItem else 0xFFFFFF88
- view.ButtonText.SetPackedFontColor(color)
- # updating scrollbar's middlebar length
- self.scrollbar.UpdateScrollbarLenght(len(self.items) * self.ELEMENT_HEIGHT)
- def _UpdateSize(self):
- viewHeight = self.ELEMENT_HEIGHT * min(len(self.items), self.viewCount)
- self.SetSize(self.GetWidth(), viewHeight)
- self.scrollbar.SetScrollBarSize(viewHeight)
- self.background.SetSize(self.GetWidth(), self.GetHeight())
- def _UpdateScrollbar(self):
- if len(self.items) > self.viewCount:
- self.scrollbar.Show()
- self.scrollbar.SetPos(0)
- self.scrollbar.SetPosition(self.elementWidth+1, 0)
- self.SetSize(self.elementWidth + 1 + self.scrollbar.GetWidth(), self.GetHeight())
- self.background.SetSize(self.GetWidth(), self.GetHeight())
- else:
- self.scrollbar.Hide()
- self.SetSize(self.elementWidth, self.GetHeight())
- self.background.SetSize(self.GetWidth(), self.GetHeight())
- def Open(self):
- self.Show()
- def Close(self):
- self.Hide()
- def GetSelectedItem(self):
- return self.selectedItem
- def SelectItem(self, index):
- self.selectedItem = index
- self._RefreshView()
- self.Close()
- if self.selectItemEvent:
- self.selectItemEvent(index, self.items[index])
- def SetSelectItemEvent(self, event):
- self.selectItemEvent = event
- def SetItems(self, items):
- self.items = items
- if not self.views:
- self._MakeViews()
- self._UpdateSize()
- self._UpdateScrollbar()
- self._RefreshView()
- def SetViewCount(self, count):
- self.viewCount = count
- self._UpdateSize()
- self._UpdateScrollbar()
- self._MakeViews()
- self._RefreshView()
- def ChangeElementImages(self, images):
- self.elementImages = images
- self._MakeViews()
- self._UpdateSize()
- self._UpdateScrollbar()
- self._RefreshView()
- # used to check via proxy ref
- def IsMe(self, combobox):
- return self is combobox
- if app.EXTEND_IKASHOP_ULTIMATE:
- class IkashopCheckBox(IkarusShopWindow):
- def __init__(self):
- super(IkashopCheckBox, self).__init__()
- self.checkEvent = None
- self.isEnabled = False
- self._LoadIkashopCheckBox()
- def _LoadIkashopCheckBox(self):
- self.text = self.CreateWidget(ui.TextLine)
- self.text.SetPackedFontColor(0xFFFFFFFF)
- self.base = self.CreateWidget(ui.ImageBox)
- self.base.SetOnMouseLeftButtonUpEvent(self.Check)
- self.checked = self.CreateWidget(ui.ImageBox, show = False)
- self.checked.SetOnMouseLeftButtonUpEvent(self.Uncheck)
- def _Resize(self):
- w = self.text.GetWidth() + 5 + max(self.base.GetWidth(), self.checked.GetWidth())
- h = max([self.text.GetHeight(), self.base.GetHeight(), self.checked.GetHeight()])
- self.base.SetPosition(self.text.GetWidth() + 5, 0)
- self.checked.SetPosition(self.text.GetWidth() + 5, 0)
- self.SetSize(w, h)
- def SetImages(self, base, checked):
- self.base.LoadImage(base)
- self.checked.LoadImage(checked)
- self._Resize()
- def SetText(self, text):
- self.text.SetText(text)
- self.text.FitText()
- self._Resize()
- def SetCheckEvent(self, event):
- self.checkEvent = event
- def Check(self, callback = 1):
- if self.isEnabled:
- self.base.Hide()
- self.checked.Show()
- if callback and self.checkEvent:
- self.checkEvent()
- def Uncheck(self, callback = 1):
- self.base.Show()
- self.checked.Hide()
- if callback and self.checkEvent:
- self.checkEvent()
- def IsChecked(self):
- return self.checked.IsShow()
- def Enable(self):
- self.isEnabled = True
- def Disable(self):
- self.isEnabled = False
- def IsEnabled(self):
- return self.isEnabled
- class IkarusSearchShopItem(IkarusShopWindow):
- def __init__(self):
- super(IkarusSearchShopItem, self).__init__()
- self.data = {'id':-1}
- self._LoadIkarusSearchShopItem()
- def _LoadIkarusSearchShopItem(self):
- # making background
- self.background = self.CreateWidget(ui.ExpandedImageBox)
- self.background.LoadImage("ikashop/lite/search_shop/result_item_box.png")
- self.SetSize(self.background.GetWidth(), self.background.GetHeight())
- # making textlines
- self.itemName = self.CreateWidget(ui.TextLine, pos = (60, 17 - 6))
- self.sellerName = self.CreateWidget(ui.TextLine, pos = (78, 41 - 6))
- self.duration = self.CreateWidget(ui.TextLine, pos = (226, 41 - 6))
- self.price = self.CreateWidget(ui.TextLine, pos = (78, 58))
- if ENABLE_CHEQUE_SYSTEM:
- self.cheque = self.CreateWidget(ui.TextLine, pos = (128 + 70, 58))
- self.chequeIcon = self.CreateWidget(ui.ImageBox, pos = (110 + 70, 59))
- self.chequeIcon.LoadImage("d:/ymir work/ui/game/windows/cheque_icon.sub")
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.priceAverage = self.CreateWidget(ui.TextLine, pos = (330-8, 58))
- self.priceAverage.SetHorizontalAlignRight()
- # making buttons
- self.buyButton = self.CreateWidget(ui.Button, pos = (261, 84))
- self.buyButton.SetUpVisual("ikashop/lite/search_shop/buy_button/default.png")
- self.buyButton.SetDownVisual("ikashop/lite/search_shop/buy_button/default.png")
- self.buyButton.SetOverVisual("ikashop/lite/search_shop/buy_button/hover.png")
- self.buyButton.SAFE_SetEvent(self._OnClickBuyButton)
- self.buyButton.SetText(locale.IKASHOP_SEARCH_SHOP_BUY_BUTTON_TEXT)
- self.offerButton = self.CreateWidget(ui.Button, pos = (189, 84))
- self.offerButton.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
- self.offerButton.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
- self.offerButton.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
- self.offerButton.SAFE_SetEvent(self._OnClickOfferButton)
- self.offerButton.SetText(locale.IKASHOP_SEARCH_SHOP_OFFER_BUTTON_TEXT)
- self.openSellingBoard = self.CreateWidget(ui.Button, pos = (50, 84), show = False)
- self.openSellingBoard.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
- self.openSellingBoard.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
- self.openSellingBoard.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
- self.openSellingBoard.SAFE_SetEvent(self._OnClickOpenSellingBoardButton)
- if app.EXTEND_IKASHOP_PRO:
- self.messageSellerButton = self.CreateWidget(ui.Button)
- self.messageSellerButton.SetUpVisual("ikashop/ultimate/seller_message/default.png")
- self.messageSellerButton.SetOverVisual("ikashop/ultimate/seller_message/hover.png")
- self.messageSellerButton.SetDownVisual("ikashop/ultimate/seller_message/default.png")
- self.messageSellerButton.SAFE_SetEvent(self._OnClickMessageSeller)
- # making slot item
- self.slot = self.CreateWidget(ui.GridSlotWindow, pos = (9, 7))
- self.slot.ArrangeSlot(0, 1, 3, SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slot.SetOverInItemEvent(self._OverInItem)
- self.slot.SetOverOutItemEvent(self._OverOutItem)
- def _OnClickBuyButton(self):
- item.SelectItem(self.data['vnum'])
- # making item name
- itemName = item.GetItemName()
- if self.data['count'] > 1:
- itemName += "({})".format(self.data['count'])
- # making item price
- if ENABLE_CHEQUE_SYSTEM:
- itemPrice = ""
- if self.data['price'] != 0:
- itemPrice += locale.NumberToMoneyString(self.data['price'])
- if self.data['cheque'] != 0:
- if itemPrice:
- itemPrice += ', '
- itemPrice += locale.NumberToCheque(self.data['cheque'])
- else:
- itemPrice = locale.NumberToMoneyString(self.data['price'])
- self.buyItemInfo = self.data['owner'], self.data['id'], self.data['price'] + self.data.get('cheque', 0) * YANG_PER_CHEQUE
- message = locale.IKASHOP_SHOP_GUEST_BUY_ITEM_QUESTION.format(itemName, itemPrice)
- self.OpenQuestionDialog(message, self._OnAcceptBuyItemQuestion)
- def _OnClickOfferButton(self):
- # checking offer min price
- if self.data['price'] + self.data.get('cheque', 0) * YANG_PER_CHEQUE < 10000:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_MAKE_OFFER_ITEM_PRICE_TOO_LOW)
- return
- self.offerInfo = self.data['id'], self.data['price'], self.data.get('cheque', 0)
- self.OpenMoneyInputDialog(self._OnAcceptMakeOfferInput)
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.moneyInputDialog.SetPriceAverage(self.data['priceavg'])
- return
- def _OnAcceptBuyItemQuestion(self):
- ikashop.SendBuyItem(*self.buyItemInfo)
- self.questionDialog.Hide()
- def _OnAcceptMakeOfferInput(self):
- self.moneyInputDialog.SoftClose()
- # validating value
- ok, value = ExtractInputPrice(self.moneyInputDialog)
- if not ok:
- self.OpenPopupDialog(locale.IKASHOP_BUSINESS_INVALID_ITEM_PRICE)
- return
- # checking for max offer price
- id, price, cheque = self.offerInfo
- if ENABLE_CHEQUE_SYSTEM:
- valueTotal = value[0] + value[1] * YANG_PER_CHEQUE
- priceTotal = price + cheque * YANG_PER_CHEQUE
- if valueTotal >= priceTotal:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
- return True
- # checking for min offer price
- minoffer = priceTotal * MIN_OFFER_PCT / 100
- if valueTotal < minoffer:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
- return True
- # checking owned cash
- if value[0] > player.GetElk() or value[1] > player.GetCheque():
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
- return True
- else:
- if value[0] >= price:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_LOWER_THAN_PRICE)
- return True
- # checking for min offer price
- minoffer = price * MIN_OFFER_PCT / 100
- if value[0] < minoffer:
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_MUST_BE_HIGHER_THAN_PCT_OF_PRICE.format(MIN_OFFER_PCT))
- return True
- # checking owned cash
- if value[0] > player.GetElk():
- self.OpenPopupDialog(locale.IKASHOP_SHOP_GUEST_OFFER_NOT_ENOUGH_MONEY)
- return True
- ikashop.SendOfferCreate(self.data['owner'], id, *value)
- return True
- def _OnClickOpenSellingBoardButton(self):
- if self.data['is_auction']:
- ikashop.SendAuctionOpenAuction(self.data['owner'])
- if app.EXTEND_IKASHOP_ULTIMATE:
- if not self.data['is_auction']:
- self.searchShopBoard.RequestOpenSellerShop(
- self.data['owner'], self.data['vnum'], self.data['count'], self.data['price'])
- def _OverInItem(self, slot):
- tooltip = self.GetToolTip()
- tooltip.ClearToolTip()
- tooltip.AddItemData(self.data['vnum'], self.data['sockets'], self.data['attrs'])
- tooltip.ShowToolTip()
- def _OverOutItem(self):
- tooltip = self.GetToolTip()
- tooltip.HideToolTip()
- if app.EXTEND_IKASHOP_PRO:
- def _OnClickMessageSeller(self):
- self.searchShopBoard.OpenWhisper(self.sellerName.GetText())
- def SetSearchShopBoard(self, board):
- self.searchShopBoard = proxy(board)
- def GetId(self):
- return self.data['id']
- def SetNotAvailable(self):
- if not self.data['is_auction']:
- self.slot.DisableSlot(0)
- self.itemName.SetPackedFontColor(0xFFFF8888)
- self.buyButton.Hide()
- self.offerButton.Hide()
- def SetAvailable(self):
- if not self.data['is_auction']:
- self.slot.EnableSlot(0)
- self.itemName.SetPackedFontColor(0xFFFFFFFF)
- self.buyButton.Show()
- self.offerButton.Show()
- def Setup(self, data):
- if data['is_auction']:
- self.buyButton.Hide()
- self.offerButton.Hide()
- self.background.LoadImage("ikashop/lite/search_shop/result_item_auction_box.png")
- self.openSellingBoard.SetText(locale.IKASHOP_SEARCH_SHOP_OPEN_AUCTION_BUTTON_TEXT)
- self.openSellingBoard.Show()
- else:
- self.buyButton.Show()
- self.offerButton.Show()
- self.background.LoadImage("ikashop/lite/search_shop/result_item_box.png")
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.openSellingBoard.SetText(locale.IKASHOP_SEARCH_SHOP_OPEN_SHOP_BUTTON_TEXT)
- self.openSellingBoard.Show()
- else:
- self.openSellingBoard.Hide()
- # setting itemname
- item.SelectItem(data['vnum'])
- itemName = item.GetItemName()
- if data['is_auction']:
- itemName += ' ' + locale.IKASHOP_SEARCH_SHOP_ITEM_NAME_AUCTION
- self.itemName.SetText(itemName)
- # setting seller name
- self.sellerName.SetText(data['seller_name'])
- if app.EXTEND_IKASHOP_PRO:
- sx, sy = self.sellerName.GetLocalPosition()
- self.messageSellerButton.SetPosition(sx + self.sellerName.GetTextSize()[0] + 10, sy)
- # setting duration
- self.duration.SetText(locale.SecondToDHM(data['duration']*60))
- # setting price
- self.price.SetText(locale.NumberToString(data['price']))
- if ENABLE_CHEQUE_SYSTEM:
- self.cheque.Show() if data['cheque'] != 0 else self.cheque.Hide()
- self.chequeIcon.Show() if data['cheque'] != 0 else self.chequeIcon.Hide()
- self.cheque.SetText(locale.NumberToString(data['cheque']))
- if app.EXTEND_IKASHOP_ULTIMATE:
- pa = locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_NOT_AVAILABLE_EMOJI if data['priceavg'] == 0 \
- else locale.IKASHOP_ULTIMATE_PRICE_AVERAGE_EMOJI.format(locale.NumberToMoneyString(data['priceavg']))
- self.priceAverage.SetText(pa)
- # setting slot
- itemcount = data['count'] if data['count'] > 1 else 0
- self.slot.ArrangeSlot(0, 1, item.GetItemSize()[1], SLOT_SIZE, SLOT_SIZE, 0, 0)
- self.slot.SetSlotBaseImage("ikashop/lite/common/slot/default.png", 1.0, 1.0, 1.0, 1.0)
- self.slot.SetItemSlot(0, data['vnum'], itemcount)
- self.data = data
- class IkarusSearchShopBoard(IkashopBoardWithTitleBar):
- RESULT_ITEM_VIEW_COUNT = 4
- ITEM_TYPES = (
- locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_WEAPON,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_ARMOR,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_JEWEL,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_COSTUME,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_PET,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_MOUNT,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_ALCHEMY,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_BOOK,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_STONE,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_MINERALS,
- locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_FISH,
- )
- SUBTYPE_WEAPON = (
- locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_SWORD,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_TWOHANDED,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_BLADE,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_DAGGER,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_BOW,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_BELL,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_FAN,
- )
- if app.ENABLE_WOLFMAN_CHARACTER:
- SUBTYPE_WEAPON += (locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_WEAPON_CLAW,)
- SUBTYPE_ARMOR = (
- locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_WARRIOR,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_SURA,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_ASSASSIN,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_SHAMAN,
- )
- if app.ENABLE_WOLFMAN_CHARACTER:
- SUBTYPE_ARMOR += (locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_ARMOR_WOLFMAN,)
- SUBTYPE_JEWEL = (
- locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_HELM,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_SHIELD,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_EAR,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_NECK,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_WRIST,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_JEWEL_SHOES,
- )
- SUBTYPE_COSTUME = (
- locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_BODY,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_WEAPON,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_HAIR,
- )
- if app.ENABLE_ACCE_COSTUME_SYSTEM:
- SUBTYPE_COSTUME += (locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_COSTUME_SASH,)
- SUBTYPE_PET = (
- locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_PET_EGGS,
- locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_PET_SEALS,
- )
- SUBTYPE_MOUNT = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
- SUBTYPE_ALCHEMY = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
- SUBTYPE_BOOKS = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
- SUBTYPE_STONE = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
- SUBTYPE_MINERAL = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
- SUBTYPE_FISH = (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,)
- SUB_TYPES = (
- (locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,),
- SUBTYPE_WEAPON,
- SUBTYPE_ARMOR,
- SUBTYPE_JEWEL,
- SUBTYPE_COSTUME,
- SUBTYPE_PET,
- SUBTYPE_MOUNT,
- SUBTYPE_ALCHEMY,
- SUBTYPE_BOOKS,
- SUBTYPE_STONE,
- SUBTYPE_MINERAL,
- SUBTYPE_FISH,
- )
- SASH_ABSORBS = (
- locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
- locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE0,
- locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE1,
- locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE2,
- locale.IKASHOP_SEARCH_SHOP_SASH_GRADE_VALUE3,
- )
- ALCHEMY_GRADES = (
- locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,
- locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_NORMAL,
- locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_BRILLIANT,
- locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_RARE,
- locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_ANCIENT,
- locale.IKASHOP_SEARCH_SHOP_DRAGON_SOUL_GRADE_LEGENDARY,
- )
- def __init__(self):
- super(IkarusSearchShopBoard, self).__init__()
- ikashop.SetSearchShopBoard(self)
- self.items = []
- self.lastOpen = 0
- self.markItemInfo = None
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.shuffleItem = None
- self._MakeItemNameContainers()
- self._SettingUpBoard()
- self._LoadSearchShopWindow()
- def __del__(self):
- super(IkarusSearchShopBoard, self).__del__()
- ikashop.SetSearchShopBoard(None)
- def _MakeItemNameContainers(self):
- names = ikashop.GetItemNames()
- self.itemNames = set()
- for name in names:
- f = name.find("+")
- if f != -1 and len(name)-1 != f and name[f+1:].isdigit():
- name = name[:f]
- self.itemNames.add(name.lower())
- def _SettingUpBoard(self):
- self.SetSize(604, 519)
- self.SetTitleName(locale.IKASHOP_SEARCH_SHOP_BOARD_TITLE)
- self.SetCloseEvent(self.Close)
- self.SetCenterPosition()
- self.AddFlag("movable")
- self.AddFlag("float")
- def _LoadLinkedBoard(self):
- self.shopGuestBoard = IkarusShopGuestBoard()
- self.auctionGuestBoard = IkarusAuctionGuestBoard()
- self.auctionListBoard = IkarusAuctionListBoard()
- self.historyFilterBoard = IkarusHistoryFilterBoard()
- self.auctionListBoard.SetSearchShopBoard(self)
- self.historyFilterBoard.SetSearchShopBoard(self)
- self.historyFilterBoard.SetFilters(ikashop.GetFilterHistory())
- def _LoadSearchShopWindow(self):
- self._LoadLinkedBoard()
- getBottom = lambda win : win.GetLocalPosition()[1] + win.GetHeight()
- getRight = lambda win : win.GetLocalPosition()[0] + win.GetWidth()
- largerComboBoxImages = (
- "ikashop/lite/search_shop/attribute_element/default.png",
- "ikashop/lite/search_shop/attribute_element/default.png",
- "ikashop/lite/search_shop/attribute_element/hover.png",
- )
- self.inputNameBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14,40))
- self.inputNameBox.LoadImage("ikashop/lite/search_shop/input_name.png")
- self.inputNameBox.SetScale(155.0 / self.inputNameBox.GetWidth(), 1.0)
- self.searchButton = self.CreateWidget(ui.Button, pos = (14 + self.inputNameBox.GetWidth() + 2, 42))
- self.searchButton.SetUpVisual("ikashop/lite/search_shop/mini_search_button/default.png")
- self.searchButton.SetDownVisual("ikashop/lite/search_shop/mini_search_button/default.png")
- self.searchButton.SetOverVisual("ikashop/lite/search_shop/mini_search_button/hover.png")
- self.searchButton.SAFE_SetEvent(self._OnClickSearchButton)
- self.searchButton.SetToolTipText(locale.IKASHOP_SEARCH_SHOP_SEARCH_BUTTON_TEXT)
- iw = self.inputNameBox.GetWidth() - self.searchButton.GetWidth() - 6
- ih = self.inputNameBox.GetHeight() - 6
- self.inputNameEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), size = (iw, ih), parent=self.inputNameBox)
- self.inputNameEdit.SetMax(ikashop.FILTER_NAME_MAX_LEN)
- self.inputNameEdit.SetEscapeEvent(ui.__mem_func__(self.inputNameEdit.KillFocus))
- self.inputNameEdit.SetUpdateEvent(self._OnUpdateInputName)
- self.inputNameBox.SetOnMouseLeftButtonUpEvent(self.inputNameEdit.SetFocus)
- self.inputNameSuggestion = self.CreateWidget(IkarusShopComboBox, pos = (14, getBottom(self.inputNameBox)+2))
- self.inputNameSuggestion.SetSelectItemEvent(self._OnSelectSuggestedItemName)
- self.inputNameSuggestion.ChangeElementImages(largerComboBoxImages)
- self.inputNameSuggestion.SetViewCount(6)
- self.inputNameSuggestion.SetItems(["",])
- self.resetFilterButton = self.CreateWidget(ui.Button, pos = (getRight(self.searchButton) + 3, 42))
- self.resetFilterButton.SetUpVisual("ikashop/lite/search_shop/reset_filter_button/default.png")
- self.resetFilterButton.SetDownVisual("ikashop/lite/search_shop/reset_filter_button/default.png")
- self.resetFilterButton.SetOverVisual("ikashop/lite/search_shop/reset_filter_button/hover.png")
- self.resetFilterButton.SAFE_SetEvent(self._OnClickResetFilters)
- self.resetFilterButton.SetToolTipText(locale.IKASHOP_SEARCH_SHOP_RESET_FILTER_BUTTON_TEXT)
- # item type filter
- self.itemTypeFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, 72))
- self.itemTypeFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
- self.itemTypeHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemTypeFilterBox)
- self.itemTypeHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_TYPE_HEADER)
- self.itemTypeSelectButton = self.CreateWidget(ui.Button, pos = (85, 8), parent = self.itemTypeFilterBox)
- self.itemTypeSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
- self.itemTypeSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
- self.itemTypeSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
- self.itemTypeSelectButton.SAFE_SetEvent(self._OnClickItemTypeSelectButton)
- self.itemTypeSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 85, 72 + 28))
- self.itemTypeSelectComboBox.SetItems(self.ITEM_TYPES)
- self.itemTypeSelectComboBox.SetSelectItemEvent(self._OnSelectItemType)
- # item subtype filter
- self.itemSubTypeHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemTypeFilterBox)
- self.itemSubTypeHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_SUBTYPE_HEADER)
- self.itemSubTypeSelectButton = self.CreateWidget(ui.Button, pos = (85, 8+26), parent = self.itemTypeFilterBox)
- self.itemSubTypeSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
- self.itemSubTypeSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
- self.itemSubTypeSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
- self.itemSubTypeSelectButton.SAFE_SetEvent(self._OnClickItemSubTypeSelectButton)
- self.itemSubTypeSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 86, 72 + 8 + 26 + 20))
- self.itemSubTypeSelectComboBox.SetSelectItemEvent(self._OnSelectItemSubType)
- self.itemSubTypeSelectComboBox.SetItems([locale.IKASHOP_SEARCH_SHOP_SELECT_AN_ELEMENT,])
- # item price filter
- self.itemPriceFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemTypeFilterBox) + 5))
- self.itemPriceFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
- self.itemPriceMinHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemPriceFilterBox)
- self.itemPriceMinHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MIN_HEADER)
- self.itemPriceMaxHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemPriceFilterBox)
- self.itemPriceMaxHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_PRICE_MAX_HEADER)
- self.itemPriceMinBox = self.CreateWidget(ui.ImageBox, pos = (64, 8), parent = self.itemPriceFilterBox)
- self.itemPriceMinBox.LoadImage("ikashop/lite/search_shop/input_box.png")
- self.itemPriceMaxBox = self.CreateWidget(ui.ImageBox, pos = (64, 8+26), parent = self.itemPriceFilterBox)
- self.itemPriceMaxBox.LoadImage("ikashop/lite/search_shop/input_box.png")
- self.itemPriceMinEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemPriceMinBox)
- self.itemPriceMinEdit.SetMax(12)
- self.itemPriceMinEdit.SetEscapeEvent(ui.__mem_func__(self.itemPriceMinEdit.KillFocus))
- self.itemPriceMinEdit.SetNumberMode()
- self.itemPriceMinBox.SetOnMouseLeftButtonUpEvent(self.itemPriceMinEdit.SetFocus)
- self.itemPriceMaxEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemPriceMaxBox)
- self.itemPriceMaxEdit.SetMax(12)
- self.itemPriceMaxEdit.SetEscapeEvent(ui.__mem_func__(self.itemPriceMaxEdit.KillFocus))
- self.itemPriceMaxEdit.SetNumberMode()
- self.itemPriceMaxBox.SetOnMouseLeftButtonUpEvent(self.itemPriceMaxEdit.SetFocus)
- # item level filter
- self.itemLevelFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemPriceFilterBox) + 5))
- self.itemLevelFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
- self.itemLevelMinHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemLevelFilterBox)
- self.itemLevelMinHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MIN_HEADER)
- self.itemLevelMaxHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemLevelFilterBox)
- self.itemLevelMaxHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ITEM_LEVEL_MAX_HEADER)
- self.itemLevelMinBox = self.CreateWidget(ui.ImageBox, pos = (64, 8), parent = self.itemLevelFilterBox)
- self.itemLevelMinBox.LoadImage("ikashop/lite/search_shop/input_box.png")
- self.itemLevelMaxBox = self.CreateWidget(ui.ImageBox, pos = (64, 8+26), parent = self.itemLevelFilterBox)
- self.itemLevelMaxBox.LoadImage("ikashop/lite/search_shop/input_box.png")
- self.itemLevelMinEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemLevelMinBox)
- self.itemLevelMinEdit.SetMax(12)
- self.itemLevelMinEdit.SetEscapeEvent(ui.__mem_func__(self.itemLevelMinEdit.KillFocus))
- self.itemLevelMinEdit.SetNumberMode()
- self.itemLevelMinBox.SetOnMouseLeftButtonUpEvent(self.itemLevelMinEdit.SetFocus)
- self.itemLevelMaxEdit = self.CreateWidget(ui.EditLine, pos = (6, 6), parent = self.itemLevelMaxBox)
- self.itemLevelMaxEdit.SetMax(12)
- self.itemLevelMaxEdit.SetEscapeEvent(ui.__mem_func__(self.itemLevelMaxEdit.KillFocus))
- self.itemLevelMaxEdit.SetNumberMode()
- self.itemLevelMaxBox.SetOnMouseLeftButtonUpEvent(self.itemLevelMaxEdit.SetFocus)
- # item attributes filter
- self.attributeSettings = GetAttributeSettings()
- self.attributeBonusToItem = {bonus[0]:index for index, bonus in enumerate(self.attributeSettings)}
- self.itemAttrsFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemLevelFilterBox) + 5))
- self.itemAttrsFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
- self.itemAttrsFilterBox.SetScale(1.0, 126.0 / self.itemAttrsFilterBox.GetHeight())
- self.attrSelectButtons = []
- self.attrComboBoxes = []
- self.attrValueBoxes = []
- self.attrValueEdits = []
- for i in xrange(ikashop.FILTER_ATTRIBUTE_NUM):
- # select button
- attrSelectButton = self.CreateWidget(ui.Button, pos = (6, 6 + i*23), parent = self.itemAttrsFilterBox)
- attrSelectButton.SetUpVisual("ikashop/lite/search_shop/attribute_select_button/default.png")
- attrSelectButton.SetDownVisual("ikashop/lite/search_shop/attribute_select_button/default.png")
- attrSelectButton.SetOverVisual("ikashop/lite/search_shop/attribute_select_button/hover.png")
- attrSelectButton.SAFE_SetEvent(self._OnClickAttributeSelectButton, i)
- attrSelectButton.SetText("")
- bx, by = attrSelectButton.ButtonText.GetLocalPosition()
- attrSelectButton.ButtonText.SetPosition(bx - 10, by)
- self.attrSelectButtons.append(attrSelectButton)
- attrComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 6, self.itemAttrsFilterBox.GetLocalPosition()[1] + 5 + i*23 + 20))
- attrComboBox.SetSelectItemEvent(lambda id, text, _self = proxy(self), _num = i : _self._OnSelectAttributeItem(_num, id, text))
- attrComboBox.ChangeElementImages(largerComboBoxImages)
- attrComboBox.SetViewCount(7)
- attrComboBox.SetItems([text for apply, text in self.attributeSettings])
- self.attrComboBoxes.append(attrComboBox)
- attrValueBox = self.CreateWidget(ui.ImageBox, pos = (148, 6 + i*23), parent = self.itemAttrsFilterBox)
- attrValueBox.LoadImage("ikashop/lite/search_shop/attribute_value_box.png")
- self.attrValueBoxes.append(attrValueBox)
- attrValueEdit = self.CreateWidget(ui.EditLine, pos = (9, 6), parent = attrValueBox)
- attrValueEdit.SetMax(4)
- attrValueEdit.SetEscapeEvent(ui.__mem_func__(attrValueEdit.KillFocus))
- attrValueEdit.SetNumberMode()
- attrValueBox.SetOnMouseLeftButtonUpEvent(attrValueEdit.SetFocus)
- self.attrValueEdits.append(attrValueEdit)
- # special filters
- self.itemSpecialFilterBox = self.CreateWidget(ui.ExpandedImageBox, pos = (14, getBottom(self.itemAttrsFilterBox) + 5))
- self.itemSpecialFilterBox.LoadImage("ikashop/lite/search_shop/filter_box.png")
- self.itemAlchemyGradeHeader = self.CreateWidget(ui.TextLine, pos = (6, 13), parent = self.itemSpecialFilterBox)
- self.itemAlchemyGradeHeader.SetText(locale.IKASHOP_SEARCH_SHOP_ALCHEMY_GRADE_HEADER)
- self.itemAlchemyGradeSelectButton = self.CreateWidget(ui.Button, pos = (85, 8), parent = self.itemSpecialFilterBox)
- self.itemAlchemyGradeSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
- self.itemAlchemyGradeSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
- self.itemAlchemyGradeSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
- self.itemAlchemyGradeSelectButton.SAFE_SetEvent(self._OnClickAlchemyGradeSelectButton)
- self.itemAlchemyGradeSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 85, getBottom(self.itemAttrsFilterBox) + 5 + 8 + 20))
- self.itemAlchemyGradeSelectComboBox.SetSelectItemEvent(self._OnSelectAlchemyGradeType)
- self.itemAlchemyGradeSelectComboBox.SetItems(self.ALCHEMY_GRADES)
- self.itemSashAbsHeader = self.CreateWidget(ui.TextLine, pos = (6, 39), parent = self.itemSpecialFilterBox)
- self.itemSashAbsHeader.SetText(locale.IKASHOP_SEARCH_SHOP_SASH_ABSORB_HEADER)
- self.itemSashAbsSelectButton = self.CreateWidget(ui.Button, pos = (85, 8+26), parent = self.itemSpecialFilterBox)
- self.itemSashAbsSelectButton.SetUpVisual("ikashop/lite/search_shop/combo_box_button/default.png")
- self.itemSashAbsSelectButton.SetDownVisual("ikashop/lite/search_shop/combo_box_button/default.png")
- self.itemSashAbsSelectButton.SetOverVisual("ikashop/lite/search_shop/combo_box_button/hover.png")
- self.itemSashAbsSelectButton.SAFE_SetEvent(self._OnClickSashGradeSelectButton)
- self.itemSashAbsSelectComboBox = self.CreateWidget(IkarusShopComboBox, pos = (14 + 86, getBottom(self.itemAttrsFilterBox) + 5 + 8 + 26 + 20))
- self.itemSashAbsSelectComboBox.SetItems(self.SASH_ABSORBS)
- self.itemSashAbsSelectComboBox.SetSelectItemEvent(self._OnSelectSashGrade)
- self.itemSashAbsSelectComboBox.SetViewCount(4)
- # buttons on the bottom
- self.auctionListButton = self.CreateWidget(ui.Button, pos = (14, getBottom(self.itemSpecialFilterBox) + 6))
- self.auctionListButton.SetUpVisual("ikashop/lite/search_shop/auction_list_button/default.png")
- self.auctionListButton.SetDownVisual("ikashop/lite/search_shop/auction_list_button/default.png")
- self.auctionListButton.SetOverVisual("ikashop/lite/search_shop/auction_list_button/hover.png")
- self.auctionListButton.SAFE_SetEvent(self._OnClickAuctionListButton)
- self.auctionListButton.SetText(locale.IKASHOP_SEARCH_SHOP_AUCTION_LIST_BUTTON_TEXT)
- tx, ty = self.auctionListButton.ButtonText.GetLocalPosition()
- self.auctionListButton.ButtonText.SetPosition(tx + 5, ty)
- self.auctionListButton.ButtonText.SetPackedFontColor(0xFFFFFFFF)
- hpos = (14 + self.itemSpecialFilterBox.GetWidth() - self.auctionListButton.GetWidth(), getBottom(self.itemSpecialFilterBox) + 6)
- self.historyButton = self.CreateWidget(ui.Button, pos = hpos)
- self.historyButton.SetUpVisual("ikashop/lite/search_shop/history_button/default.png")
- self.historyButton.SetDownVisual("ikashop/lite/search_shop/history_button/default.png")
- self.historyButton.SetOverVisual("ikashop/lite/search_shop/history_button/hover.png")
- self.historyButton.SAFE_SetEvent(self._OnClickHistoryButton)
- self.historyButton.SetText(locale.IKASHOP_SEARCH_SHOP_HISTORY_BUTTON_TEXT)
- tx, ty = self.historyButton.ButtonText.GetLocalPosition()
- self.historyButton.ButtonText.SetPosition(tx + 5, ty)
- self.historyButton.ButtonText.SetPackedFontColor(0xFFFFFFFF)
- self.resultBox = self.CreateWidget(ui.ExpandedImageBox, pos = (227, 40))
- self.resultBox.LoadImage("ikashop/lite/search_shop/result_box.png")
- self.resultBox.SetMouseWheelEvent(self._OnScrollMouseWheelResultItems)
- hs = float(self.resultBox.GetWidth() - 10) / self.resultBox.GetWidth()
- vs = 469.0 / self.resultBox.GetHeight()
- self.resultBox.SetScale(hs, vs)
- # making result items
- self.resultItems = []
- for i in xrange(self.RESULT_ITEM_VIEW_COUNT):
- item = self.CreateWidget(IkarusSearchShopItem, pos = (5, 4 + 116*i), parent = self.resultBox)
- item.SetSearchShopBoard(self)
- self.resultItems.append(item)
- # making result item scrollbar
- self.resultItemScrollBar = self.CreateWidget(ui.ScrollBar, pos = (self.resultBox.GetWidth() - 19, 3), parent = self.resultBox)
- self.resultItemScrollBar.SetScrollEvent(self._OnScrollResultItems)
- self.resultItemScrollBar.SetScrollBarSize(self.resultBox.GetHeight() - 6)
- # making automatically close the combo box
- # and setting them on top, with 0th element selected
- self.comboBoxes = []
- for value in vars(self).values() + self.attrComboBoxes:
- if isinstance(value, IkarusShopComboBox):
- value.AddFlag("float")
- value.SetTop()
- value.SelectItem(0)
- self._RegisterDialog(value)
- self.comboBoxes.append(proxy(value))
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.sortByPriceCheckbox = self.CreateWidget(IkashopCheckBox)
- self.sortByPriceCheckbox.SetImages("ikashop/ultimate/sort_checkbox/base.png", "ikashop/ultimate/sort_checkbox/checked.png")
- self.sortByPriceCheckbox.SetText(locale.IKASHOP_ULTIMATE_SORT_BY_PRICE_CHECKBOX)
- self.sortByPriceCheckbox.SetPosition(self.GetWidth() - 40 - self.sortByPriceCheckbox.GetWidth(), 7)
- self.sortByPriceCheckbox.SetCheckEvent(self._OnCheckSortByPriceCheckBox)
- def _ExtractFilterTypes(self):
- return \
- self.itemTypeSelectComboBox.GetSelectedItem(),\
- self.itemSubTypeSelectComboBox.GetSelectedItem()
- def _ExtractFilterPrice(self):
- minPrice = self.itemPriceMinEdit.GetText()
- minPrice = minPrice.lower().replace("k", "000")
- minPrice = long(minPrice) if minPrice and minPrice.isdigit() else long(0)
- maxPrice = self.itemPriceMaxEdit.GetText()
- maxPrice = maxPrice.lower().replace("k", "000")
- maxPrice = long(maxPrice) if maxPrice and maxPrice.isdigit() else long(0)
- return minPrice, maxPrice
- def _ExtractFilterLevel(self):
- minLevel = self.itemLevelMinEdit.GetText()
- minLevel = int(minLevel) if minLevel and minLevel.isdigit() else 0
- maxLevel = self.itemLevelMaxEdit.GetText()
- maxLevel = int(maxLevel) if maxLevel and maxLevel.isdigit() else 0
- return minLevel, maxLevel
- def _ExtractFilterAttributes(self):
- def extractOne(combo, edit):
- if combo.GetSelectedItem() == 0:
- return 0,0
- bonus = self.attributeSettings[combo.GetSelectedItem()][0]
- value = edit.GetText()
- value = int(value) if value and value.isdigit() else 0
- return bonus, value
- ret = tuple(extractOne(self.attrComboBoxes[i], self.attrValueEdits[i]) for i in xrange(ikashop.FILTER_ATTRIBUTE_NUM))
- return ret
- def _ExtractFilterSpecial(self):
- sashAbs = self.itemSashAbsSelectComboBox.GetSelectedItem()
- dssGrade = self.itemAlchemyGradeSelectComboBox.GetSelectedItem()
- return sashAbs, dssGrade
- def _ExtractFilterSettings(self):
- # getting values
- inputName = self.inputNameEdit.GetText()
- type, subtype = self._ExtractFilterTypes()
- prices = self._ExtractFilterPrice()
- levels = self._ExtractFilterLevel()
- attributes = self._ExtractFilterAttributes()
- specials = self._ExtractFilterSpecial()
- # making arg tuple
- args = (inputName, type, subtype, prices, levels, attributes, specials)
- if not IsUsingFilter(args):
- return None
- return args
- def _OnClickSearchButton(self):
- self.inputNameEdit.KillFocus()
- filters = self._ExtractFilterSettings()
- if filters is None:
- self.OpenPopupDialog(locale.IKASHOP_SEARCH_SHOP_NO_FILTER_USED)
- return
- ikashop.SendFilterRequest(*filters)
- def _OnClickAuctionListButton(self):
- self.auctionListBoard.Toggle()
- def _OnClickItemTypeSelectButton(self):
- for combo in self.comboBoxes:
- if not combo.IsMe(self.itemTypeSelectComboBox) and combo.IsShow():
- combo.Close()
- self.itemTypeSelectComboBox.Toggle()
- def _OnClickItemSubTypeSelectButton(self):
- for combo in self.comboBoxes:
- if not combo.IsMe(self.itemSubTypeSelectComboBox) and combo.IsShow():
- combo.Close()
- self.itemSubTypeSelectComboBox.Toggle()
- def _OnSelectItemType(self, index, text):
- self.itemTypeSelectButton.SetText(text)
- self.itemSubTypeSelectComboBox.SetItems(self.SUB_TYPES[index])
- self.itemSubTypeSelectComboBox.SelectItem(0)
- def _OnSelectItemSubType(self, index, text):
- self.itemSubTypeSelectButton.SetText(text)
- def _OnSelectAttributeItem(self, num, index, text):
- usingButton = self.attrSelectButtons[num]
- for i in xrange(100):
- btext = text[:-i] if i > 0 else text
- if i != 0:
- btext += ".."
- usingButton.SetText(btext)
- if usingButton.ButtonText.GetTextSize()[0] + 35 < usingButton.GetWidth():
- break
- def _OnClickAttributeSelectButton(self, num):
- usingComboBox = self.attrComboBoxes[num]
- for combo in self.comboBoxes:
- if not combo.IsMe(usingComboBox) and combo.IsShow():
- combo.Close()
- usingComboBox.Toggle()
- def _OnClickSashGradeSelectButton(self):
- for combo in self.comboBoxes:
- if not combo.IsMe(self.itemSashAbsSelectComboBox) and combo.IsShow():
- combo.Close()
- self.itemSashAbsSelectComboBox.Toggle()
- def _OnSelectSashGrade(self, index, text):
- self.itemSashAbsSelectButton.SetText(text)
- def _OnClickAlchemyGradeSelectButton(self):
- for combo in self.comboBoxes:
- if not combo.IsMe(self.itemAlchemyGradeSelectComboBox) and combo.IsShow():
- combo.Close()
- self.itemAlchemyGradeSelectComboBox.Toggle()
- def _OnSelectAlchemyGradeType(self, index, text):
- self.itemAlchemyGradeSelectButton.SetText(text)
- def _OnUpdateInputName(self, isFocus):
- if not isFocus or len(self.inputNameEdit.GetText()) < 3:
- self.inputNameSuggestion.Close()
- return
- text = self.inputNameEdit.GetText().lower()
- most_relevant = []
- less_relevant = []
- for name in self.itemNames:
- if name.startswith(text):
- most_relevant.append(name)
- elif text in name:
- less_relevant.append(name)
- most_relevant = sorted(most_relevant)
- less_relevant = sorted(less_relevant)
- suggestions = most_relevant + less_relevant
- self.inputNameSuggestion.SetItems(suggestions)
- if suggestions:
- self.inputNameSuggestion.Open()
- else:
- self.inputNameSuggestion.Close()
- def _OnSelectSuggestedItemName(self, index, name):
- self.inputNameEdit.SetText(name)
- self.inputNameEdit.KillFocus()
- def _OnClickResetFilters(self):
- # selecting 0 item on each combo box
- for combo in self.comboBoxes:
- if not combo.IsMe(self.inputNameSuggestion):
- combo.SelectItem(0)
- # resetting edit line values
- self.itemPriceMinEdit.SetText("")
- self.itemPriceMaxEdit.SetText("")
- self.itemLevelMinEdit.SetText("")
- self.itemLevelMaxEdit.SetText("")
- self.inputNameEdit.SetText("")
- for edit in self.attrValueEdits:
- edit.SetText("")
- def _OnClickHistoryButton(self):
- self.historyFilterBoard.Toggle()
- def _OnScrollResultItems(self):
- self._RefreshResultItem()
- def _OnScrollMouseWheelResultItems(self, delta):
- self.resultItemScrollBar.OnDown() if delta < 0\
- else self.resultItemScrollBar.OnUp()
- return True
- def _RefreshResultItem(self):
- # calculating sindex
- pos = self.resultItemScrollBar.GetPos() if self.resultItemScrollBar.IsShow() else 0.0
- diff = max(len(self.items) - self.RESULT_ITEM_VIEW_COUNT, 0)
- sindex = int(diff * pos)
- eindex = sindex + min(len(self.items), self.RESULT_ITEM_VIEW_COUNT)
- # hiding all views
- for view in self.resultItems:
- view.Hide()
- # setting up and showing only used views
- for i in xrange(sindex, eindex):
- ri = i - sindex
- data = self.items[i]
- view = self.resultItems[ri]
- view.Setup(data)
- view.Show()
- view.SetAvailable() if data.get('deleted', 0) == 0 \
- else view.SetNotAvailable()
- # updating scrollbar's middlebar length
- self.resultItemScrollBar.UpdateScrollbarLenght(4 + 116*len(self.items))
- def _UpdateScrollbarState(self):
- self.resultItemScrollBar.Show() if self.RESULT_ITEM_VIEW_COUNT < len(self.items)\
- else self.resultItemScrollBar.Hide()
- self.resultItemScrollBar.SetPos(0)
- def _ApplySearchFilterSettings(self, settings):
- # setting up name
- self.inputNameEdit.SetText(settings['name'])
- # setting up prices
- self.itemPriceMaxEdit.SetText(str(settings['price_max']) if settings['price_max'] != 0 else "")
- self.itemPriceMinEdit.SetText(str(settings['price_min']) if settings['price_min'] != 0 else "")
- # setting up levels
- self.itemLevelMaxEdit.SetText(str(settings['level_max']) if settings['level_max'] != 0 else "")
- self.itemLevelMinEdit.SetText(str(settings['level_min']) if settings['level_min'] != 0 else "")
- # setting up comboboxes
- self.itemTypeSelectComboBox.SelectItem(settings['type'])
- self.itemSubTypeSelectComboBox.SelectItem(settings['subtype'])
- self.itemSashAbsSelectComboBox.SelectItem(settings['sash'])
- self.itemAlchemyGradeSelectComboBox.SelectItem(settings['alchemy'])
- # setting up attributes
- for attrComboBox, attrEdit, sett in zip(self.attrComboBoxes, self.attrValueEdits, settings['attrs']):
- type, value = sett
- attrEdit.SetText(str(value) if value != 0 else "")
- attrComboBox.SelectItem(self.attributeBonusToItem[type])
- def HistoryRedoSearch(self, settings):
- self._ApplySearchFilterSettings(settings)
- self._OnClickSearchButton()
- def Open(self):
- now = app.GetTime()
- if self.lastOpen == 0 or now - self.lastOpen > 60 or len(self.items) == 0:
- ikashop.SendRandomSearchFillRequest()
- self._IsRandomFilling = True
- return
- self.lastOpen = now
- self.Show()
- self.SetTop()
- def Close(self):
- self.Hide()
- self.inputNameEdit.KillFocus()
- def DeleteSearchResultItem(self, id):
- for item in self.items:
- if item['id'] == id:
- item['deleted'] = 1
- for view in self.resultItems:
- if view.GetId() == id:
- view.SetNotAvailable()
- if app.EXTEND_IKASHOP_ULTIMATE:
- def RequestOpenSellerShop(self, owner, vnum, count, price):
- if not self.sortByPriceCheckbox.IsEnabled():
- self.OpenPopupDialog(locale.IKASHOP_ULTIMATE_SORT_BY_PRICE_PREMIUM_FEATURE)
- return
- self.markItemInfo = vnum, count, price
- ikashop.SendOpenShop(owner)
- def _OnSortByPrice(self):
- priceGetter = lambda item : item['price'] + item.get('cheque', 0) * YANG_PER_CHEQUE
- self.items = sorted(self.items, key = priceGetter) if self.sortByPriceCheckbox.IsChecked() \
- else self.shuffleItem
- self._RefreshResultItem()
- def _OnCheckSortByPriceCheckBox(self):
- if not self.sortByPriceCheckbox.IsEnabled():
- self.OpenPopupDialog(locale.IKASHOP_ULTIMATE_SORT_BY_PRICE_PREMIUM_FEATURE)
- return
- self._OnSortByPrice()
- def ActiveSortByPriceFeature(self):
- self.sortByPriceCheckbox.Enable()
- self.sortByPriceCheckbox.Check(callback=0)
- def DeactiveSortByPriceFeature(self):
- self.sortByPriceCheckbox.Disable()
- self.sortByPriceCheckbox.Uncheck(callback=1)
- # BINARY CALLS
- def SetSearchResultItems(self, items):
- shuffle(items)
- self.items = items
- if app.EXTEND_IKASHOP_ULTIMATE:
- self.shuffleItem = items
- self._UpdateScrollbarState()
- if self.IsShow() == False:
- self.Show()
- self.SetTop()
- self.lastOpen = app.GetTime()
- if not self._IsRandomFilling:
- self.RegisterHistoryFilter()
- self._IsRandomFilling = False
- def OpenShopGuest(self, data):
- self.shopGuestBoard.Open(data)
- if self.markItemInfo:
- vnum, count, price = self.markItemInfo
- self.shopGuestBoard.MarkItems(vnum, count, price)
- def ShopExpiredGuesting(self, id):
- self.shopGuestBoard.CheckExpiring(id)
- def ShopGuestRemoveItem(self, itemid):
- self.shopGuestBoard.ShopGuestRemoveItem(itemid)
- def ShopGuestEditItem(self, itemid, price):
- self.shopGuestBoard.EditItem(itemid, price)
- def OpenAuctionGuest(self, data):
- self.auctionGuestBoard.Open(data)
- def SetAuctionList(self, auctions):
- self.auctionListBoard.SetAuctions(auctions)
- def RegisterHistoryFilter(self):
- filter = self._ExtractFilterSettings()
- ikashop.RegisterFilterHistory(len(self.items), *filter)
- self.historyFilterBoard.SetFilters(ikashop.GetFilterHistory())
- if app.EXTEND_IKASHOP_PRO:
- def SetOpenWhisper(self, event):
- self.openWhisperEvent = event
- def OpenWhisper(self, name):
- self.openWhisperEvent(name)
- if app.EXTEND_IKASHOP_ULTIMATE:
- class IkarusShopSkinListView(IkarusShopWindow):
- def __init__(self):
- super(IkarusShopSkinListView, self).__init__()
- self._LoadIkarusShopSkinListView()
- def _LoadIkarusShopSkinListView(self):
- self.button = self.CreateWidget(ui.Button)
- self.button.SetUpVisual("ikashop/ultimate/skin_select_button/default.png")
- self.button.SetOverVisual("ikashop/ultimate/skin_select_button/hover.png")
- self.button.SetDownVisual("ikashop/ultimate/skin_select_button/default.png")
- self.button.SetText("")
- self.button.ButtonText.SetPackedFontColor(0xFFFFFFFF)
- self.button.ButtonText.SetHorizontalAlignLeft()
- self.button.ButtonText.SetPosition(20, self.button.GetHeight()/2)
- self.SetSize(self.button.GetWidth(), self.button.GetHeight())
- def Setup(self, data):
- index, name = data
- self.button.SetText(name)
- self.index = index
- def SetOnClick(self, event):
- self.button.SAFE_SetEvent(event, proxy(self))
- class IkarusShopSkinBoard(IkarusShopListBoard):
- SKIN_VIEW_COUNT = 6
- SHOP_SKIN_COUNT = 7
- def __init__(self):
- self.selected = None
- super(IkarusShopSkinBoard, self).__init__()
- ikashop.SetShopSkinBoard(self)
- self._SettingUpBoard()
- self._LoadIkarusShopSkinBoard()
- def _SettingUpBoard(self):
- # setting list board
- self.SetSize(500, 260)
- super(IkarusShopSkinBoard, self)._SettingUpBoard()
- self.SetTitleName(locale.IKASHOP_ULTIMATE_SHOP_SKIN_BOARD_TITLE)
- def Destroy(self):
- ikashop.SetShopSkinBoard(None)
- super(IkarusShopSkinBoard, self).Destroy()
- def _LoadIkarusShopSkinBoard(self):
- # simulating smaller size to reduce list board size only
- ui.Window.SetSize(self, 500, 220)
- super(IkarusShopSkinBoard, self)._LoadIkarusShopListBoard()
- ui.Window.SetSize(self, 500, 260)
- self._MakeListElements(IkarusShopSkinListView, self.SKIN_VIEW_COUNT)
- for view in self.views:
- view.SetPosition(196, view.GetLocalPosition()[1])
- view.SetOnClick(self._OnClickView)
- self.skinImage = self.CreateWidget(ui.ImageBox, x = 10, y = 37)
- self.acceptButton = self.CreateWidget(ui.Button, pos = (346 - 65 - 5, 225))
- self.acceptButton.SetUpVisual("ikashop/lite/search_shop/buy_button/default.png")
- self.acceptButton.SetDownVisual("ikashop/lite/search_shop/buy_button/default.png")
- self.acceptButton.SetOverVisual("ikashop/lite/search_shop/buy_button/hover.png")
- self.acceptButton.SAFE_SetEvent(self._OnClickAcceptButton)
- self.acceptButton.SetText(locale.IKASHOP_OFFER_LIST_ACCEPT_OFFER_BUTTON_TEXT)
- self.cancelButton = self.CreateWidget(ui.Button, pos = (346 + 4 + self.acceptButton.GetWidth() - 65 + 5, 225))
- self.cancelButton.SetUpVisual("ikashop/lite/search_shop/offer_button/default.png")
- self.cancelButton.SetDownVisual("ikashop/lite/search_shop/offer_button/default.png")
- self.cancelButton.SetOverVisual("ikashop/lite/search_shop/offer_button/hover.png")
- self.cancelButton.SAFE_SetEvent(self._OnClickCancelButton)
- self.cancelButton.SetText(locale.IKASHOP_OFFER_LIST_CANCEL_OFFER_BUTTON_TEXT)
- def Open(self):
- images = ["ikashop/ultimate/decoration/{}.png".format(i+1) for i in xrange(self.SHOP_SKIN_COUNT)]
- names = [locale.IKASHOP_ULTIMATE_SHOP_SKIN_NAME.format(i+1) for i in xrange(self.SHOP_SKIN_COUNT)]
- self.data = [{'name' : name, 'image' : image} for name, image in zip(names,images)]
- self.Show()
- self.SetTop()
- self.SetElements([(index, name) for index, name in enumerate(names)])
- self._SelectElement(0)
- self.elementScrollbar.SetPos(0)
- def Close(self):
- self.Hide()
- def _OnClickView(self, view):
- self._SelectElement(view.index)
- self._RefreshElements()
- def _SelectElement(self, index):
- image = self.data[index]['image']
- name = "|cFFFFFF99|h"+self.data[index]['name']+"|r"
- if self.selected != None:
- self.elements[self.selected] = (self.selected, self.data[self.selected]['name'])
- self.skinImage.LoadImage(image)
- self.elements[index] = (index,name)
- self.selected = index
- def _OnClickAcceptButton(self):
- message = locale.IKASHOP_ULTIMATE_SHOP_SKIN_USAGE_QUESTION
- self.OpenQuestionDialog(message, self._OnAcceptSkinUsageQuestion)
- def _OnClickCancelButton(self):
- self.Close()
- def _OnAcceptSkinUsageQuestion(self):
- self.questionDialog.Hide()
- self.Close()
- ikashop.SendShopDecorationUse(self.selected+1)
Add Comment
Please, Sign In to add comment