Marty-v58/client/pack/root/uiikashop.py
2024-10-25 00:14:42 -05:00

4110 lines
148 KiB
Python

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