Tipologie server:
*Resursă folosită:Avenor Offlineshop
*ServerFiles utilizat:clean
*Syserr:
1225 14:15:19749 :: Traceback (most recent call last):
1225 14:15:19750 :: File "uiPhaseCurtain.py", line 58, in OnUpdate
1225 14:15:19750 :: File "networkModule.py", line 157, in __ChangePhaseWindow
1225 14:15:19750 :: File "game.py", line 279, in Open
1225 14:15:19750 :: File "uiOfflineshop.py", line 2798, in __init__
1225 14:15:19751 :: File "uiOfflineshop.py", line 2957, in __loadWindow
1225 14:15:19751 :: File "ui.py", line 4531, in GetChild
1225 14:15:19751 :: KeyError
1225 14:15:19751 :: :
1225 14:15:19751 :: 'ShopSafeboxPage'
1225 14:15:19751 ::
*Detalii suplimentare:Aveti aici uiofflineshop.py si offlineshopwindow.py, nu inteleg de ce nu imi gaseste ShopSafeboxPage, din moment ce il am...
import offlineshop
import ui
import app
import item
import player
import dbg
import uiCommon
import uiToolTip
import localeInfo
import ime
import snd
import uiPickMoney
import grp
import mouseModule
import constInfo
SUBTYPE_NOSET = 255
SEARCH_RESULT_LIMIT = 250
COLOR_TEXT_SHORTCUT = grp.GenerateColor(0.7607, 0.7607, 0.7607, 1.0)
def IsBuildingShop():
interface = offlineshop.GetOfflineshopBoard()
if not interface:
return False
return interface.IsBuildingShop()
def IsSaleSlot(win,slot):
interface = offlineshop.GetOfflineshopBoard()
if not interface:
return False
return interface.IsForSaleSlot(win,slot)
def IsForAuctionSlot(win,slot):
interface = offlineshop.GetOfflineshopBoard()
if not interface:
return False
return interface.IsForAuctionSlot(win, slot)
def IsBuildingAuction():
interface = offlineshop.GetOfflineshopBoard()
if not interface:
return False
return interface.IsBuildingAuction()
def PutsError(line):
dbg.TraceError("offlineshop interface error : %s "%line)
def NumberToString(num):
if num < 0:
return "-" + NumberToString(-num)
parts = []
while num >= 1000:
parts.insert(0,"%03d"%(num%1000))
num = num//1000
parts.insert(0,"%d"%num)
return '.'.join(parts)
def GetDurationString(dur):
days = dur // (24 * 60)
hours = (dur//60)%24
minutes = dur%60
res = ""
if days > 0:
res += localeInfo.OFFLINESHOP_DAY_TEXT%days + " "
if hours > 0:
res += localeInfo.OFFLINESHOP_HOUR_TEXT%hours + " "
if minutes > 0:
res += localeInfo.OFFLINESHOP_MINUTE_TEXT%minutes
if days == 0 and hours == 0 and minutes == 0:
return localeInfo.OFFLINESHOP_MINUTE_TEXT%0
return res
def GetDurationStringRB(dur):
days = dur // (24 * 60)
hours = (dur//60)%24
minutes = dur%60
res = "|cff82ff7d|H|h"
if days > 0:
res += "%dd"%days + " "
else:
res += "%dd"%0 + " "
if hours > 0:
res += "%02dh"%hours + " "
else:
res += "%02dh"%0 + " "
if minutes > 0:
res += "%02dm"%minutes
else:
res += "%02dm"%0 + " "
if days == 0 and hours == 0 and minutes == 0:
return localeInfo.OFFLINESHOP_MINUTE_TEXT%0
res += "|h|r"
return res
def MakeSlotInfo(window, slotIndex, yang):
res = {}
itemIndex = player.GetItemIndex(window, slotIndex)
itemCount = player.GetItemCount(window, slotIndex)
res["slot"] = slotIndex
res["window"]= window
res["vnum"] = itemIndex
res["count"] = itemCount
res["socket"]= {}
res["attr"] = {}
try:
if app.ENABLE_CHANGELOOK_SYSTEM:
res['trans'] = player.GetItemTransmutation(window, slotIndex)
except:
pass
for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
attr = player.GetItemAttribute(window, slotIndex, x)
res['attr'][x] = {}
res['attr'][x]["type"] = attr[0]
res['attr'][x]["value"] = attr[1]
for x in xrange(player.METIN_SOCKET_MAX_NUM):
res['socket'][x] = player.GetItemMetinSocket(window, slotIndex, x)
res["price"] = yang
return res
def MakeOfferCancelButton():
btn = ui.Button()
btn.SetUpVisual("offlineshop/myoffers/deleteoffer_default.png")
btn.SetDownVisual("offlineshop/myoffers/deleteoffer_down.png")
btn.SetOverVisual("offlineshop/myoffers/deleteoffer_over.png")
btn.Show()
return btn
def MakeOfferViewImage(isView):
flag = "0"
if isView:
flag="1"
img = ui.ImageBox()
img.LoadImage("scripts/offlineshop/viewicon_%s.png"%flag)
img.Show()
return img
def MakeDefaultEmptySlot(event = None):
slot = Slot(False)
if event:
slot.SetOnMouseLeftButtonUpEvent(event)
return slot
def GetBestOfferPriceYang(lst):
if not lst:
return 0
max =0
for info in lst:
if info['price_yang'] > max:
max = info['price_yang']
return max
def SortByDatetime(lst):
def CustomSortByDatetime(a,b):
def CmpFunc(a,b):
if a > b:
return -1
if b > a:
return 1
return 0
keys = ('year' , 'month' , 'day', 'hour', 'minute')
for k in keys:
if a[k] != b[k]:
return CmpFunc(a[k] , b[k])
return 0
lst.sort(cmp=CustomSortByDatetime)
def SortOffersByPrice(lst):
def CustomSortByOfferPrice(a,b):
price_a = a.get('price_yang', 0)
price_b = b.get('price_yang', 0)
if price_a > price_b:
return -1
if price_b < price_b:
return 1
return 0
lst.sort(cmp=CustomSortByOfferPrice)
return lst
class TableWindow(ui.Window):
def __init__(self, col, row, width, height, realw, realh):
ui.Window.__init__(self)
self.rows = row
self.columns = col
self.width = width
self.height = height
ui.Window.SetSize(self, realw, realh)
def __del__(self):
ui.Window.__del__(self)
def __GetCoordByPos(self, col,row, child):
stepx = self.width/self.columns
stepy = self.height/self.rows
x = stepx * col
y = stepy * row
x += stepx/2 - child.GetWidth() /2
y += stepy/2 - child.GetHeight()/2
return x,y
def SetTableElement(self, column , row, child= None):
if self.rows <= row:
PutsError("cannot SetTableElement on row %d"%row)
return
if self.columns <= column:
PutsError("cannot SetTableElement on column %d (row %d )"%(column,row))
return
if child == None:
return
x,y = self.__GetCoordByPos(column, row, child)
child.SetParent(self)
child.SetPosition( x, y)
child.Show()
class TableWindowData(ui.Window):
def __init__(self, col, row, width, height, realw, realh):
ui.Window.__init__(self)
self.rows = row
self.columns = col
self.width = width
self.height = height
ui.Window.SetSize(self, realw, realh)
def __del__(self):
ui.Window.__del__(self)
def __GetCoordByPos(self, col,row, child):
stepx = self.width/self.columns
stepy = self.height/self.rows
x = stepx * col
y = stepy * row
x += stepx/2 - child.GetWidth() /2
y += stepy/2 - child.GetHeight()/2
return x,y
def SetTableElement(self, column , row, child= None):
if self.rows <= row:
PutsError("cannot SetTableElement on row %d"%row)
return
if self.columns <= column:
PutsError("cannot SetTableElement on column %d (row %d )"%(column,row))
return
if child == None:
return
x,y = self.__GetCoordByPos(column, row, child)
child.SetParent(self)
child.SetPosition( x, y)
child.Show()
import grp
class NewListBox(ui.Window):
def __init__(self):
ui.Window.__init__(self)
self.items = []
self.selected = None
self.basePos = 0
self.itemWidth = 100
self.itemStep = 4
self.scrollbar = None
self.scrollBarPos = 0.0
self.selectEvent = None
def SetSize(self, w, h):
ui.Window.SetSize(self, w, h + self.itemStep)
self.SetItemWidth(w)
self.UpdateList()
def SetScrollBar(self, scrollbar):
self.scrollbar = scrollbar
self.scrollbar.SetScrollEvent(ui.__mem_func__(self.__OnScroll))
self.scrollbar.SetScrollStep(0.10)
self.UpdateList()
def CalcTotalItemHeight(self):
total_height = 0
for item in self.items:
total_height += item.GetHeight()
total_height += self.itemStep
return total_height
def ConfigureScrollBar(self):
if self.scrollbar:
itemheight = self.CalcTotalItemHeight()
myheight = self.GetHeight() - 8
dif = 0.97
if itemheight > myheight and itemheight != 0:
dif = 1.0 * myheight / itemheight
self.scrollbar.SetMiddleBarSize(dif)
def __OnScroll(self, position = None):
pos = self.scrollbar.GetPos() if position == None else position
self.scrollBarPos = pos
toscr = self.CalcTotalItemHeight() - self.GetHeight() - 8
self.basePos = toscr * pos
self.UpdateList()
# if app.ENABLE_WHEEL_MOUSE: #EDW
# def OnRunMouseWheel(self, nLen):
# if self.scrollbar:
# self.scrollbar.OnRunMouseWheel(nLen)
def GetScrollBarPosition(self):
return self.scrollBarPos
def OnScroll(self, pos):
self.__OnScroll(pos)
def SelectItem(self, item):
self.selected = item
if self.selectEvent:
self.selectEvent(item)
def AppendItem(self, item):
item.SetParent(self)
item.SetWidth(self.itemWidth)
item.Show()
self.items.append(item)
self.UpdateList()
def RemoveItem(self, item):
item.Hide()
self.items.remove(item)
self.UpdateList()
def ClearItems(self):
map(lambda wnd: wnd.Hide(), self.items)
del self.items[:]
self.basePos = 0
if self.scrollbar:
self.scrollbar.SetPos(0)
self.UpdateList()
def UpdateList(self):
self.ConfigureScrollBar()
self.RecalcItemPositions()
def IsEmpty(self):
return len(self.itemList) == 0
def SetItemWidth(self, w):
self.itemWidth = w
for item in self.items:
item.SetWidth(w)
def RecalcItemPositions(self):
curbp = self.basePos
itemheight = self.CalcTotalItemHeight()
myheight = self.GetHeight() - 2 * self.itemStep
if itemheight < myheight:
curbp = 0
fromPos = curbp
curPos = 0
toPos = curbp + self.GetHeight()
for item in self.items:
hw = item.GetHeight()
if curPos + hw < fromPos:
item.Hide()
elif curPos < fromPos and curPos + hw > fromPos:
item.SetRenderMin(fromPos - curPos)
item.Show()
elif curPos < toPos and curPos + hw > toPos:
item.SetRenderMax(toPos - curPos)
item.Show()
elif curPos > toPos:
item.Hide()
else:
item.SetRenderMin(0)
item.Show()
item.SetPosition(0, curPos - fromPos)
curPos += hw + self.itemStep
class NewListBoxItem(ui.Window):
DEFAULT_COLOR = grp.GenerateColor(0.0, 0.0, 0.0, 0.3)
HOVER_COLOR = grp.GenerateColor(0.0, 0.0, 1.1, 0.3)
LEFT_COLOR = grp.GenerateColor(0.0, 0.7, 1.1, 0.3)
def __init__(self):
ui.Window.__init__(self)
self.width = 0
self.height = 0
self.minh = 0
self.maxh = 0
self.isLeft = 0
self.components = []
def __del__(self):
ui.Window.__del__(self)
def SetColor(self, color):
self.color = color
def OnMouseOverIn(self):
if self.isLeft:
self.color = LEFT_COLOR = grp.GenerateColor(0.0, 0.7, 1.1, 0.3)
else:
self.color = NewListBoxItem.HOVER_COLOR
def OnMouseOverOut(self):
if self.isLeft:
self.color = LEFT_COLOR = grp.GenerateColor(0.0, 0.7, 1.1, 0.3)
else:
self.color = NewListBoxItem.DEFAULT_COLOR
def SetColorLeft(self):
self.color = NewListBoxItem.LEFT_COLOR
self.isLeft = 1
def SetParent(self, parent):
ui.Window.SetParent(self, parent)
def SetHeight(self, h):
self.SetSize(self.width, h)
def SetWidth(self, w):
self.SetSize(w, self.height)
def SetSize(self, w, h):
self.width = w
self.height = h
self.maxh = h
ui.Window.SetSize(self, w, h)
def SetRenderMin(self, minh):
self.minh = minh
self.maxh = self.height
self.RecalculateRenderedComponents()
def SetRenderMax(self, maxh):
self.maxh = maxh
self.minh = 0
self.RecalculateRenderedComponents()
def RegisterComponent(self, component):
mtype = type(component).__name__
if mtype == "Bar" or mtype == "line":
(x, y, w, h) = component.GetRect()
(x, y) = component.GetLocalPosition()
component.__list_data = [x, y, w, h]
self.components.append(component)
def UnregisterComponent(self, component):
self.components.remove(component)
def RecalculateRenderedComponents(self):
for component in self.components:
(xl, yl) = component.GetLocalPosition()
(x, y, w, h) = component.GetRect()
mtype = type(component).__name__
if mtype == "TextLine":
(w, h) = component.GetTextSize()
if yl + h < self.minh:
component.Hide()
elif yl > self.maxh:
component.Hide()
else:
if mtype == "ExpandedImageBox" or mtype == "ExpandedButton":
miny = 0
if self.minh > 0 and yl < self.minh:
miny = -float(self.minh - yl) / float(h)
maxy = 0
if h != 0:
maxy = float(self.maxh - yl - h) / float(h)
maxy = min(0, max(-1, maxy))
component.SetRenderingRect(0.0, miny, 0.0, maxy)
component.Show()
else:
if yl < self.minh or yl + h > self.maxh:
component.Hide()
else:
component.Show()
def OnRender(self):
self.DARK_COLOR = 0xFF3D3331
x, y = self.GetGlobalPosition()
xRender, yRender = self.GetGlobalPosition()
yRender -= 3
widthRender = self.GetWidth()
heightRender = self.GetHeight() + 3
grp.SetColor(self.color)
grp.RenderBar(x, y + self.minh, self.GetWidth(), self.maxh - self.minh)
class ShopSearchItem(NewListBoxItem):
MARGIN = 7.5
COUNT_FONT_SIZE = 14
SPECIAL_TITLE_COLOR = grp.GenerateColor(1.0, 0.7843, 0.0, 1.0)
HIGH_PRICE_COLOR = SPECIAL_TITLE_COLOR
MIDDLE_PRICE_COLOR = grp.GenerateColor(0.85, 0.85, 0.85, 1.0)
LOW_PRICE_COLOR = grp.GenerateColor(0.7, 0.7, 0.7, 1.0)
def __init__(self):
NewListBoxItem.__init__(self)
self.slot = []
self.slotInfo = {}
self.tooltipItem = uiToolTip.ItemToolTip()
self.tooltipItem.Hide()
self.eventClick = None
self.index = 0
self.Instance = self
self.LoadDialog()
self.LoadTexts()
self.SetColor(NewListBoxItem.DEFAULT_COLOR)
def __del__(self):
self.__clear()
NewListBoxItem.__del__(self)
def __clear(self):
self.slotInfo = {}
self.eventClick = None
self.index = 0
def Destroy(self):
self.__clear()
def LoadDialog(self):
slotImageFileName = ["slot_32x32.tga", "slot_32x64.tga", "slot_32x96.tga"]
for i in xrange(3):
slot = ui.ExpandedImageBox()
slot.SetParent(self)
slot.SetPosition(16, ShopSearchItem.MARGIN)
slot.LoadImage("scripts/shop/%s" % (slotImageFileName))
slot.OnMouseOverIn = self.__OverInItem
slot.OnMouseOverOut = self.__OverOutItem
slot.Show()
self.RegisterComponent(slot)
self.slot.append(slot)
self.itemImage = ui.ExpandedImageBox()
self.itemImage.SetParent(self)
self.itemImage.SetPosition(0, ShopSearchItem.MARGIN)
self.itemImage.Show()
self.itemImage.OnMouseOverIn = self.__OverInItem
self.itemImage.OnMouseOverOut = self.__OverOutItem
self.RegisterComponent(self.itemImage)
self.itemCount = ui.TextLine()
self.itemCount.SetParent(self)
self.itemCount.SetText("")
self.itemCount.SetFontName("Arial:%d" % ShopSearchItem.COUNT_FONT_SIZE)
self.itemCount.SetHorizontalAlignLeft()
self.itemCount.Show()
self.RegisterComponent(self.itemCount)
self.itemName = ui.TextLine()
self.itemName.SetParent(self)
self.itemName.SetText("")
self.itemName.SetFontName("Arial:%d" % ShopSearchItem.COUNT_FONT_SIZE)
self.itemName.SetHorizontalAlignLeft()
self.itemName.Show()
self.RegisterComponent(self.itemName)
self.itemOwner = ui.TextLine()
self.itemOwner.SetParent(self)
self.itemOwner.SetText("")
self.itemOwner.SetFontName("Arial:%d" % ShopSearchItem.COUNT_FONT_SIZE)
self.itemOwner.SetHorizontalAlignLeft()
self.itemOwner.Show()
self.RegisterComponent(self.itemOwner)
self.itemPriceYang = ui.TextLine()
self.itemPriceYang.SetParent(self)
self.itemPriceYang.SetText("")
self.itemPriceYang.SetFontName("Arial:%d" % ShopSearchItem.COUNT_FONT_SIZE)
self.itemPriceYang.SetHorizontalAlignRight()
self.itemPriceYang.Show()
self.RegisterComponent(self.itemPriceYang)
self.itemPriceYangIcon = ui.TextLine()
self.itemPriceYangIcon.SetParent(self)
self.itemPriceYangIcon.SetText("")
self.itemPriceYangIcon.SetFontName("Arial:%d" % ShopSearchItem.COUNT_FONT_SIZE)
self.itemPriceYangIcon.SetHorizontalAlignRight()
self.itemPriceYangIcon.Show()
self.RegisterComponent(self.itemPriceYangIcon)
self.buyQuestionDlg = uiCommon.QuestionDialog()
self.buyQuestionDlg.SetText("uiScriptLocale.SEARCH_SHOP_BUY_CONFIGM")
self.buyQuestionDlg.SetAcceptEvent(lambda: self.__BuyItem(True))
self.buyQuestionDlg.SetCancelEvent(lambda: self.__BuyItem(False))
self.__AppendItem()
def LoadTexts(self):
pass
def SetInfo(self, info):
self.slotInfo = info
self.SetSlot(info["vnum"], info["count"])
def GetInfo(self):
return self.slotInfo
def SetIndex(self, index):
self.index = index
def GetIndex(self):
return self.index
def SetSlot(self, itemVnum, itemCount):
item.SelectItem(itemVnum)
image = item.GetIconImageFileName()
name = item.GetItemName()
width, height = item.GetItemSize()
self.__SetItemIconImage(image)
self.__SetData(name, itemCount, width, height)
self.SetSize(300, ShopSearchItem.MARGIN*2+32*height)
self.BottomLine = ui.Line()
self.BottomLine.SetParent(self)
self.BottomLine.SetPosition(0, self.GetHeight() + 2)
self.BottomLine.SetSize(375, 0)
self.BottomLine.SetColor(0xFF3D3331)
self.BottomLine.Show()
self.RegisterComponent(self.BottomLine)
def __SetItemIconImage(self, icon):
self.itemImage.LoadImage(item.GetIconImageFileName())
def __SetData(self, itemName, itemCount, itemWidth, itemHeight):
lSpace = 55-15
ownerName = self.slotInfo["owner_name"]
priceYang = self.slotInfo["price"]
priceYangColor = self.GetPriceColor(priceYang)
if itemCount > 1:
self.itemCount.SetText("x" + str(itemCount))
lSpace = 80-15
self.itemName.SetText(itemName)
if self.slotInfo["owner_name"] != "":
self.itemOwner.SetText("|Eemoji/mail|e " + ownerName)
w, h = self.itemOwner.GetTextSize()
self.itemOwner.SetSize(w, h)
self.itemOwner.OnMouseLeftButtonDown = lambda : player.OpenPrivateMessage(ownerName)
else:
self.itemOwner.SetText("|Eemoji/offline|e Offline")
self.itemPriceYang.SetText(localeInfo.NumberToStringAsType(priceYang))
self.itemPriceYangIcon.SetText(localeInfo.SHOP_TYPE_MONEY)
self.itemPriceYang.SetTextColor(priceYangColor)
self.itemCount.SetPosition(45-13, ShopSearchItem.MARGIN + (itemHeight * 32 + ShopSearchItem.COUNT_FONT_SIZE - 27) / 2)
self.itemName.SetPosition(lSpace, ShopSearchItem.MARGIN + (itemHeight * 32 - ShopSearchItem.COUNT_FONT_SIZE) / 2)
self.itemOwner.SetPosition(195-12, ShopSearchItem.MARGIN + (itemHeight * 32 - ShopSearchItem.COUNT_FONT_SIZE) / 2)
self.itemPriceYang.SetPosition(376, ShopSearchItem.MARGIN + (itemHeight * 20 - ShopSearchItem.COUNT_FONT_SIZE + 10) / 2)
self.itemPriceYangIcon.SetPosition(395, ShopSearchItem.MARGIN + (itemHeight * 20 - ShopSearchItem.COUNT_FONT_SIZE + 10) / 2)
def __AppendItem(self):
for slot in self.slot:
slot.Hide()
try:
self.UnregisterComponent(slot)
except:
pass
def FormatWaitTime(self, time):
m, s = divmod(time, 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
return "%02d:%02d:%02d:%02d" % (d, h, m, s)
def GetPriceColor(self, price):
if price>= 500000:
return ShopSearchItem.HIGH_PRICE_COLOR
if price>=50000:
return ShopSearchItem.MIDDLE_PRICE_COLOR
else:
return ShopSearchItem.LOW_PRICE_COLOR
def __OverInItem(self):
if not self.tooltipItem.IsShow():
info = self.slotInfo
sockets = [info["socket"][num] for num in xrange(player.METIN_SOCKET_MAX_NUM)]
attrs = [(info["attr"][num]['type'], info["attr"][num]['value']) for num in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
self.tooltipItem.ClearToolTip()
self.tooltipItem.AddItemData(info["vnum"], sockets, attrs)
self.tooltipItem.AppendPrice(info["price"])
self.tooltipItem.Show()
def __OverOutItem(self):
if self.tooltipItem:
self.tooltipItem.HideToolTip()
def SetOnMouseLeftButtonUpEvent(self, event):
self.eventClick = event
ui.Window.SetOnMouseLeftButtonUpEvent(self, self.__OnClick)
if self.itemImage:
self.itemImage.SetOnMouseLeftButtonUpEvent(self.__OnClick)
def __OnClick(self):
if self.eventClick!=None:
self.eventClick(self)
def OnMouseLeftButtonUp(self):
self.__OnClick()
pass
def OnMouseRightButtonUp(self):
pass
class TableWindowWithScrollbar(TableWindow):
SCROLLBAR_HORIZONTAL = 0
SCROLLBAR_VERTICAL = 1
def __init__(self, w, h , columns, rows, scrollbar=0):
htable = h if scrollbar == self.SCROLLBAR_VERTICAL else h-18
wtable = w if scrollbar == self.SCROLLBAR_HORIZONTAL else w -18
TableWindow.__init__(self , columns, rows , wtable, htable, w ,h)
self.childrenDict = {}
self.scrollbar = None
self.rows_count = rows
self.columns_count = columns
self.total_row = 0
self.elementCount = 0
self.defaultCreate = None
self.defaultCreateArgs = None
self.defaultChildren = []
self.__loadScrollbar(scrollbar)
self.ClearElement()
def __del__(self):
self.childrenDict = {}
self.scrollbar = None
self.defaultCreate = None
self.defaultCreateArgs = None
self.defaultChildren = []
TableWindow.__del__(self)
def __loadScrollbar(self, scrollbar):
if scrollbar == self.SCROLLBAR_VERTICAL:
template = {
'button1' : {
'default' : 'offlineshop/scrollbar/vertical/button1_default.png',
'over' : 'offlineshop/scrollbar/vertical/button1_over.png',
'down' : 'offlineshop/scrollbar/vertical/button1_down.png',
},
'button2' : {
'default' : 'offlineshop/scrollbar/vertical/button2_default.png',
'over' : 'offlineshop/scrollbar/vertical/button2_over.png',
'down' : 'offlineshop/scrollbar/vertical/button2_down.png',
},
'middle' : {
'default' : 'scripts/shop/slimscroll/middle.png',
'over' : 'scripts/shop/slimscroll/middle.png',
'down' : 'scripts/shop/slimscroll/middle.png',
},
'base' : "scripts/shop/slimscroll/base.png",
'onscroll' : self.__refreshViewList,
'parent' : self,
'orientation' : ui.CustomScrollBar.VERTICAL,
'align' : {'mode': ui.CustomScrollBar.RIGHT,'offset2':5},
}
else:
template = {
'button1' : {
'default' : 'offlineshop/scrollbar/horizontal/button1_default.png',
'over' : 'offlineshop/scrollbar/horizontal/button1_over.png',
'down' : 'offlineshop/scrollbar/horizontal/button1_down.png',
},
'button2' : {
'default' : 'offlineshop/scrollbar/horizontal/button2_default.png',
'over' : 'offlineshop/scrollbar/horizontal/button2_over.png',
'down' : 'offlineshop/scrollbar/horizontal/button2_down.png',
},
'middle' : {
'default' : 'offlineshop/scrollbar/horizontal/middle_default.png',
'over' : 'offlineshop/scrollbar/horizontal/middle_over.png',
'down' : 'offlineshop/scrollbar/horizontal/middle_down.png',
},
'base' : "offlineshop/scrollbar/horizontal/base_image.png",
'onscroll' : self.__refreshViewList,
'parent' : self,
'orientation' : ui.CustomScrollBar.HORIZONTAL,
'align' : {'mode':ui.CustomScrollBar.BOTTOM,},
}
self.scrollbar = ui.CustomScrollBar(template)
def SetElement(self, column, row, child):
if not row in self.childrenDict:
self.childrenDict[row] = {}
self.childrenDict[row][column] = child
self.__refreshViewList()
def SetDefaultCreateChild(self, func, *args):
self.defaultCreate = func
self.defaultCreateArgs = args
def __refreshViewList(self):
if self.scrollbar.orientation == ui.CustomScrollBar.VERTICAL:
if len(self.childrenDict.keys()) <= self.rows_count:
self.scrollbar.Hide()
else:
self.scrollbar.Show()
init_row = self.__getInitRow()
for row, dct in self.childrenDict.items():
for column, child in dct.items():
if row < init_row or row >= init_row + self.rows_count:
child.Hide()
continue
self.SetTableElement(column, row-init_row , child)
for s in self.defaultChildren:
s.Destroy()
self.defaultChildren = []
if self.defaultCreate:
for row in xrange(init_row, init_row + self.rows_count):
for col in xrange(self.columns_count):
if not row in self.childrenDict or not col in self.childrenDict[row]:
defaultChild = self.defaultCreate(*self.defaultCreateArgs) if self.defaultCreateArgs else self.defaultCreate()
defaultChild.Show()
self.SetTableElement(col, row - init_row, defaultChild)
self.defaultChildren.append(defaultChild)
elif self.scrollbar.orientation == ui.CustomScrollBar.HORIZONTAL:
if len(self.childrenDict.get(0, [])) <= self.columns_count:
self.scrollbar.Hide()
else:
self.scrollbar.Show()
init_column = self.__getInitColumn()
end_column = init_column+ self.columns_count
for dct in self.childrenDict.values():
for elm in dct.values():
elm.Hide()
for col in xrange(init_column, end_column):
for row, dct in self.childrenDict.items():
if col in dct:
self.SetTableElement(col-init_column, row , dct[col])
dct[col].Show()
for s in self.defaultChildren:
s.Destroy()
self.defaultChildren = []
if self.defaultCreate:
for row in xrange(0, self.rows_count):
for col in xrange(init_column, end_column):
if not row in self.childrenDict or not col in self.childrenDict[row]:
defaultChild = self.defaultCreate(*self.defaultCreateArgs) if self.defaultCreateArgs else self.defaultCreate()
defaultChild.Show()
self.SetTableElement(col-init_column, row, defaultChild)
self.defaultChildren.append(defaultChild)
def __getInitRow(self):
if not self.scrollbar.IsShow():
return 0
return int((len(self.childrenDict.keys()) - self.rows_count ) * self.scrollbar.GetPos())
def __getInitColumn(self):
if not self.scrollbar.IsShow():
return 0
return int((len(self.childrenDict.get(0,[])) - self.columns_count ) * self.scrollbar.GetPos())
def __AdjustScrollbarStep(self):
total_slots = self.rows_count*self.columns_count
extra_element = self.elementCount - (total_slots)
if extra_element <= 0:
return
if self.scrollbar.orientation == ui.CustomScrollBar.HORIZONTAL:
extra_col = int(extra_element // self.rows_count)
if extra_element % self.rows_count != 0:
extra_col += 1
self.scrollbar.SetScrollStep(1.0 / float(extra_col+1))
else:
extra_row_count = int(extra_element/self.columns_count)
if extra_element % self.columns_count != 0:
extra_row_count += 1
self.scrollbar.SetScrollStep(1.0/float(extra_row_count+1))
def ClearElement(self):
for a in self.childrenDict.values():
for child in a.values():
child.Hide()
self.childrenDict = {}
self.elementCount = 0
self.__refreshViewList()
def AddElement(self, child):
normElement = self.columns_count*self.rows_count
if self.elementCount < normElement or self.scrollbar.orientation == ui.CustomScrollBar.VERTICAL:
column = self.elementCount%self.columns_count
row = self.elementCount//self.columns_count
else:
index = self.elementCount - normElement
row = index % self.rows_count
column= index //self.rows_count
column += self.columns_count
self.SetElement(column, row, child)
self.elementCount += 1
self.__AdjustScrollbarStep()
def GetElementDict(self):
return self.childrenDict
# if app.ENABLE_WHEEL_MOUSE: #EDW
# def OnRunMouseWheel(self, nLen):
# if self.scrollbar:
# self.scrollbar.OnRunMouseWheel(nLen)
class TableWindowWithScrollbarData(TableWindowData):
SCROLLBAR_HORIZONTAL = 0
SCROLLBAR_VERTICAL = 1
def __init__(self, w, h , columns, rows, scrollbar=0):
htable = h if scrollbar == self.SCROLLBAR_VERTICAL else h-18
wtable = w if scrollbar == self.SCROLLBAR_HORIZONTAL else w -18
TableWindowData.__init__(self , columns, rows , wtable, htable, w ,h)
self.childrenDict = {}
self.scrollbar = None
self.rows_count = rows
self.columns_count = columns
self.total_row = 0
self.elementCount = 0
self.defaultCreate = None
self.defaultCreateArgs = None
self.defaultChildren = []
self.__loadScrollbar(scrollbar)
self.ClearElement()
def __del__(self):
self.childrenDict = {}
self.scrollbar = None
self.defaultCreate = None
self.defaultCreateArgs = None
self.defaultChildren = []
TableWindowData.__del__(self)
def __loadScrollbar(self, scrollbar):
if scrollbar == self.SCROLLBAR_VERTICAL:
template = {
'button1' : {
'default' : 'offlineshop/scrollbar/vertical/button1_default.png',
'over' : 'offlineshop/scrollbar/vertical/button1_over.png',
'down' : 'offlineshop/scrollbar/vertical/button1_down.png',
},
'button2' : {
'default' : 'offlineshop/scrollbar/vertical/button2_default.png',
'over' : 'offlineshop/scrollbar/vertical/button2_over.png',
'down' : 'offlineshop/scrollbar/vertical/button2_down.png',
},
'middle' : {
'default' : 'offlineshop/scrollbar/vertical/middle_default.png',
'over' : 'offlineshop/scrollbar/vertical/middle_over.png',
'down' : 'offlineshop/scrollbar/vertical/middle_down.png',
},
'base' : "offlineshop/scrollbar/vertical/base_image.png",
'onscroll' : self.__refreshViewList,
'parent' : self,
'orientation' : ui.CustomScrollBar.VERTICAL,
'align' : {'mode': ui.CustomScrollBar.RIGHT,},
}
else:
template = {
'button1' : {
'default' : 'offlineshop/scrollbar/horizontal/button1_default.png',
'over' : 'offlineshop/scrollbar/horizontal/button1_over.png',
'down' : 'offlineshop/scrollbar/horizontal/button1_down.png',
},
'button2' : {
'default' : 'offlineshop/scrollbar/horizontal/button2_default.png',
'over' : 'offlineshop/scrollbar/horizontal/button2_over.png',
'down' : 'offlineshop/scrollbar/horizontal/button2_down.png',
},
'middle' : {
'default' : 'offlineshop/scrollbar/horizontal/middle_default.png',
'over' : 'offlineshop/scrollbar/horizontal/middle_over.png',
'down' : 'offlineshop/scrollbar/horizontal/middle_down.png',
},
'base' : "offlineshop/scrollbar/horizontal/base_image.png",
'onscroll' : self.__refreshViewList,
'parent' : self,
'orientation' : ui.CustomScrollBar.HORIZONTAL,
'align' : {'mode':ui.CustomScrollBar.BOTTOM,},
}
self.scrollbar = ui.CustomScrollBar(template)
def SetElement(self, column, row, child):
if not row in self.childrenDict:
self.childrenDict[row] = {}
self.childrenDict[row][column] = child
self.__refreshViewList()
def SetDefaultCreateChild(self, func, *args):
self.defaultCreate = func
self.defaultCreateArgs = args
def __refreshViewList(self):
if self.scrollbar.orientation == ui.CustomScrollBar.VERTICAL:
if len(self.childrenDict.keys()) <= self.rows_count:
self.scrollbar.Hide()
else:
self.scrollbar.Show()
init_row = self.__getInitRow()
for row, dct in self.childrenDict.items():
for column, child in dct.items():
if row < init_row or row >= init_row + self.rows_count:
child.Hide()
continue
self.SetTableElement(column, row-init_row , child)
#updated 25-01-2020 #topatch
for s in self.defaultChildren:
s.Destroy()
self.defaultChildren = []
if self.defaultCreate:
for row in xrange(init_row, init_row + self.rows_count):
for col in xrange(self.columns_count):
if not row in self.childrenDict or not col in self.childrenDict[row]:
defaultChild = self.defaultCreate(*self.defaultCreateArgs) if self.defaultCreateArgs else self.defaultCreate()
defaultChild.Show()
self.SetTableElement(col, row - init_row, defaultChild)
self.defaultChildren.append(defaultChild)
elif self.scrollbar.orientation == ui.CustomScrollBar.HORIZONTAL:
if len(self.childrenDict.get(0, [])) <= self.columns_count:
self.scrollbar.Hide()
else:
self.scrollbar.Show()
init_column = self.__getInitColumn()
end_column = init_column+ self.columns_count
for dct in self.childrenDict.values():
for elm in dct.values():
elm.Hide()
for col in xrange(init_column, end_column):
for row, dct in self.childrenDict.items():
if col in dct:
self.SetTableElement(col-init_column, row , dct[col])
dct[col].Show()
#updated 25-01-2020 #topatch
for s in self.defaultChildren:
s.Destroy()
self.defaultChildren = []
if self.defaultCreate:
for row in xrange(0, self.rows_count):
for col in xrange(init_column, end_column):
if not row in self.childrenDict or not col in self.childrenDict[row]:
defaultChild = self.defaultCreate(*self.defaultCreateArgs) if self.defaultCreateArgs else self.defaultCreate()
defaultChild.Show()
self.SetTableElement(col-init_column, row, defaultChild)
self.defaultChildren.append(defaultChild)
def __getInitRow(self):
if not self.scrollbar.IsShow():
return 0
return int((len(self.childrenDict.keys()) - self.rows_count ) * self.scrollbar.GetPos())
def __getInitColumn(self):
if not self.scrollbar.IsShow():
return 0
return int((len(self.childrenDict.get(0,[])) - self.columns_count ) * self.scrollbar.GetPos())
def __AdjustScrollbarStep(self):
total_slots = self.rows_count*self.columns_count
extra_element = self.elementCount - (total_slots)
if extra_element <= 0:
return
if self.scrollbar.orientation == ui.CustomScrollBar.HORIZONTAL:
extra_col = int(extra_element // self.rows_count)
if extra_element % self.rows_count != 0:
extra_col += 1
self.scrollbar.SetScrollStep(1.0 / float(extra_col+1))
else:
extra_row_count = int(extra_element/self.columns_count)
if extra_element % self.columns_count != 0:
extra_row_count += 1
self.scrollbar.SetScrollStep(1.0/float(extra_row_count+1))
def ClearElement(self):
for a in self.childrenDict.values():
for child in a.values():
child.Hide()
self.childrenDict = {}
self.elementCount = 0
self.__refreshViewList()
def AddElement(self, child):
normElement = self.columns_count*self.rows_count
if self.elementCount < normElement or self.scrollbar.orientation == ui.CustomScrollBar.VERTICAL:
column = self.elementCount%self.columns_count
row = self.elementCount//self.columns_count
else:
index = self.elementCount - normElement
row = index % self.rows_count
column= index //self.rows_count
column += self.columns_count
self.SetElement(column, row, child)
self.elementCount += 1
self.__AdjustScrollbarStep()
def GetElementDict(self):
return self.childrenDict
# if app.ENABLE_WHEEL_MOUSE: #EDW
# def OnRunMouseWheel(self, nLen):
# if self.scrollbar:
# self.scrollbar.OnRunMouseWheel(nLen)
class ResultListElement(ui.Window):
def __init__(self , info):
ui.Window.__init__(self)
self.__LoadWindow(info)
def __del__(self):
ui.Window.__del__(self)
def __LoadWindow(self, info):
self.__LoadOpenShopButton()
def __LoadOpenShopButton(self):
button = ui.Button()
button.SetParent(self)
button.SetUpVisual("scripts/offlineshop/test_1.png")
button.SetDownVisual("scripts/offlineshop/test_2.png")
button.SetOverVisual("scripts/offlineshop/test_3.png")
button.SetPosition(0, 0)
button.Show()
self.SetSize(button.GetWidth(), button.GetHeight())
self.openShopButton = button
def SetInfo(self, info):
self.slotInfo = info
self.SetSlot(info["vnum"] , info["count"])
def SetSlot(self, itemvnum, itemcount):
item.SelectItem(itemvnum)
image = item.GetIconImageFileName()
name = item.GetItemName()
width, height = item.GetItemSize()
self.__SetItemIconImage(image, width, height)
def __SetItemIconImage(self, icon, w, h):
image = ui.ExpandedImageBox()
image.LoadImage(icon)
image.SetParent(self)
image.SetScale(0.7, 0.7)
image.SetPosition(0,5)
image.Show()
self.iconImage = image
class Slot(ui.Window):
def __init__(self, isSold=False):
ui.Window.__init__(self)
self.background = None
self.background_sold = None
self.iconImage = None
self.countText = None
self.upgradeImage = None
self.slotInfo = {}
self.index = 0
self.eventClick = None
self.childrens = []
self.__loadBackground(isSold)
print("initializing Slot")
#updated 25-01-2020 #topatch
def __del__(self):
self.__clear()
ui.Window.__del__(self)
#updated 25-01-2020 #topatch
def __clear(self):
self.background = None
self.iconImage = None
self.countText = None
self.upgradeImage = None
self.background_sold = None
ui.Window.SetOnMouseLeftButtonUpEvent(self, None)
if self.background:
self.background.SetOnMouseLeftButtonUpEvent(None)
if self.iconImage:
self.iconImage.SetOnMouseLeftButtonUpEvent(None)
if self.countText:
self.countText.SetOnMouseLeftButtonUpEvent(None)
if self.upgradeImage:
self.upgradeImage.SetOnMouseLeftButtonUpEvent(None)
if self.background_sold:
self.background_sold.SetOnMouseLeftButtonUpEvent(None)
self.slotInfo = {}
self.index = 0
self.eventClick = None
self.childrens = []
#updated 25-01-2020 #topatch
def Destroy(self):
self.__clear()
def __loadBackground(self, isSold):
bg = ui.ImageBox()
bg.LoadImage("offlineshop/slot/base_image.png")
bg.SetParent(self)
bg.SetPosition(0,0)
bg.Show()
self.SetSize(bg.GetWidth(), bg.GetHeight())
self.background = bg
sold = ui.ImageBox()
sold.LoadImage("offlineshop/slot/base_image_sold.png")
sold.SetParent(self.background)
sold.SetPosition(0, 0)
if isSold:
sold.Show()
else:
sold.Hide()
self.background_sold = sold
def SetInfo(self, info):
self.slotInfo = info
self.SetSlot(info["vnum"] , info["count"])
def GetInfo(self):
return self.slotInfo
def SetSlot(self, itemvnum, itemcount):
item.SelectItem(itemvnum)
image = item.GetIconImageFileName()
name = item.GetItemName()
self.__SetItemIconImage(image)
self.__SetItemCount(itemcount)
self.__SetUpgradeByName(name)
def SetIndex(self, index):
self.index = index
def GetIndex(self):
return self.index
def SetSold(self, flag):
if flag:
self.background_sold.Show()
else:
self.background_sold.Hide()
def __GetIconPosition(self, image):
w = image.GetWidth()
h = image.GetHeight()
return (self.background.GetWidth()/2 - w/2, self.background.GetHeight()/2 - h/2)
def __SetItemIconImage(self, icon):
image = ui.ImageBox()
image.LoadImage(icon)
image.SetParent(self.background)
x,y = self.__GetIconPosition(image)
image.SetPosition(x,y)
image.Show()
self.iconImage = image
def __GetCountPosition(self):
x,y = self.iconImage.GetLocalPosition()
x += self.iconImage.GetWidth()/2
y += self.iconImage.GetHeight()
return (x,y)
def __SetItemCount(self, count):
if count <= 1:
self.countText = None
return
countText = ui.TextLine()
countText.SetParent(self.background)
x,y = self.__GetCountPosition()
countText.SetPosition(x,y)
countText.SetHorizontalAlignCenter()
countText.SetText("x"+str(count))
countText.Show()
self.countText = countText
def __GetUpgradeImagePosition(self,img):
w = img.GetWidth()
h = img.GetHeight()
bw = self.background.GetWidth()
bh = self.background.GetHeight()
return (bw - (w+5), bh-(h+5))
def __SetUpgradeByName(self, name):
name = name.strip()
if len(name) > 2:
if name[-2] == '+':
if name[-1].isdigit():
value = int(name[-1])
upgrade = ui.ImageBox()
upgrade.LoadImage("offlineshop/slot/upgrade/%d.png"%value)
upgrade.SetParent(self.background)
x,y = self.__GetUpgradeImagePosition(upgrade)
upgrade.SetPosition(x,y)
upgrade.Show()
self.upgradeImage = upgrade
def SetOnMouseLeftButtonUpEvent(self, event):
self.eventClick = event
ui.Window.SetOnMouseLeftButtonUpEvent(self, self.__OnClick)
if self.background:
self.background.SetOnMouseLeftButtonUpEvent(self.__OnClick)
if self.iconImage:
self.iconImage.SetOnMouseLeftButtonUpEvent(self.__OnClick)
if self.countText:
self.countText.SetOnMouseLeftButtonUpEvent(self.__OnClick)
if self.upgradeImage:
self.upgradeImage.SetOnMouseLeftButtonUpEvent(self.__OnClick)
if self.background_sold:
self.background_sold.SetOnMouseLeftButtonUpEvent(self.__OnClick)
def __OnClick(self):
if self.eventClick!=None:
self.eventClick(self)
def IsInSlot(self):
if not self.IsShow():
return False
if self.IsIn():
return True
if self.background:
if self.background.IsIn():
return True
if self.iconImage:
if self.iconImage.IsIn():
return True
if self.countText:
if self.countText.IsIn():
return True
if self.upgradeImage:
if self.upgradeImage.IsIn():
return True
if self.background_sold:
if self.background_sold.IsShow() and self.background_sold.IsIn():
return True
if self.childrens:
for child in self.childrens:
if child.IsIn():
return True
return False
def AppendChild(self, child):
child.SetParent(self.background)
self.childrens.append(child)
class Offer(ui.Window):
def __init__(self, info):
ui.Window.__init__(self)
self.bgImage = None
self.guestName = None
self.priceText = None
self.acceptButton = None
self.deleteButton = None
self.itemText = None
self.info = {}
self.index = 0
self.is_accept = 0
self.acceptEvent = None
self.deniedEvent = None
self.info = info
self.index = info["id"]
self.is_accept = info["is_accept"]
self.__loadBackground()
self.__loadButtons()
self.SetGuestName(info['buyer_name'])
self.SetPriceYang(info["price"])
def __del__(self):
self.bgImage = None
self.guestName = None
self.priceText = None
self.acceptButton = None
self.deleteButton = None
self.itemText = None
self.info = {}
self.index = 0
self.is_accept = 0
self.acceptEvent = None
self.deniedEvent = None
ui.Window.__del__(self)
def __loadBackground(self):
bg = ui.ImageBox()
bg.SetParent(self)
bg.SetPosition(0,0)
bg.LoadImage("scripts/offlineshop/data_input_1_norm.png")
bg.Show()
self.SetSize(bg.GetWidth(), bg.GetHeight())
self.bgImage = bg
def SetGuestName(self, name):
text = ui.TextLine()
text.SetParent(self.bgImage)
text.SetPosition(77 , 0)
text.SetHorizontalAlignCenter()
text.Show()
text.SetText(name)
self.guestName = text
def SetPriceYang(self, yang):
text = ui.TextLine()
text.SetParent(self.bgImage)
text.SetPosition(355 , 0)
# text.SetHorizontalAlignCenter()
text.Show()
text.SetText(localeInfo.NumberToMoneyString(yang))
self.priceText = text
def SetItemName(self, name):
text = ui.TextLine()
text.SetParent(self.bgImage)
text.SetPosition(239 , 0)
text.SetHorizontalAlignCenter()
text.Show()
text.SetText(name)
self.itemText = text
def __loadButtons(self):
if self.info["is_accept"]:
return
#accept
button = ui.Button()
button.SetParent(self.bgImage)
button.SetPosition(self.bgImage.GetWidth() - 50, 0)
path = "offlineshop/offer/accept_%s.png"
button.SetUpVisual(path%"default")
button.SetOverVisual(path%"over")
button.SetDownVisual(path%"down")
button.Show()
self.acceptButton = button
button = ui.Button()
button.SetParent(self.bgImage)
button.SetPosition(self.bgImage.GetWidth() - 30, 0)
path = "offlineshop/offer/cancel_%s.png"
button.SetUpVisual(path%"default")
button.SetOverVisual(path%"over")
button.SetDownVisual(path%"down")
button.Show()
self.deleteButton = button
def SetAcceptButtonEvent(self, event):
if self.acceptButton:
self.acceptButton.SAFE_SetEvent(self.__OnAccept)
self.acceptEvent = event
def SetDeleteButtonEvent(self, event):
if self.deleteButton:
self.deleteButton.SAFE_SetEvent(self.__OnCancel)
self.deniedEvent = event
def GetInfo(self):
return self.info
def __OnAccept(self):
if self.acceptEvent:
self.acceptEvent(self)
def __OnCancel(self):
if self.deniedEvent:
self.deniedEvent(self)
class AuctionOffer(ui.Window):
def __init__(self, info):
ui.Window.__init__(self)
self.background = None
self.ownerName = None
self.offerText = None
self.__LoadWindow(info)
def __del__(self):
self.background = None
self.ownerName = None
self.offerText = None
ui.Window.__del__(self)
def __LoadWindow(self, info):
name = info["buyer_name"]
best_yang = info['price_yang']
self.__LoadBackground()
self.__LoadOwnerName(name)
self.__LoadOfferText(best_yang)
def GetInfo(self):
return self.info
def __LoadBackground(self):
bg = ui.ImageBox()
bg.LoadImage("scripts/offlineshop/data_input_2_norm.png")
bg.SetParent(self)
bg.SetPosition(0, 0)
bg.Show()
self.SetSize(bg.GetWidth(), bg.GetHeight())
self.background = bg
def __LoadOwnerName(self, ownerName):
if not ownerName:
return
text = ui.TextLine()
text.SetParent(self.background)
text.SetPosition(186, 5)
text.SetHorizontalAlignCenter()
text.SetText(ownerName)
text.Show()
self.ownerName = text
def __LoadOfferText(self, yang):
text = ui.TextLine()
text.SetParent(self.background)
text.SetPosition(403, 5)
text.SetHorizontalAlignCenter()
text.SetText(localeInfo.NumberToMoneyString(yang))
text.Show()
self.offerText = text
class MyOffer(ui.Window):
def __init__(self, info):
ui.Window.__init__(self)
self.info = info
self.clear()
self.__LoadBackground()
self.__LoadSlots()
self.__LoadOwnerName()
self.__LoadOfferText()
self.__LoadSlot()
self.__LoadCancelButton()
def clear(self):
self.background = None
self.slotName = None
self.slotOffer = None
self.slot1 = None
self.slot2 = None
self.ownerName = None
self.offerText = None
self.slot = None
self.cancelButton = None
self.cancelButtonEvent = None
def __del__(self):
self.clear()
ui.Window.__del__(self)
def __LoadBackground(self):
bg = ui.ImageBox()
bg.SetParent(self)
bg.SetPosition(0,0)
bg.LoadImage("scripts/offlineshop/my_offers_background.png")
bg.Show()
self.SetSize(bg.GetWidth(), bg.GetHeight())
self.background = bg
def __LoadSlots(self):
slotName = ui.TextLine()
slotName.SetParent(self.background)
slotName.SetPosition(100, 10)
slotName.SetText(localeInfo.OFFLINESHOP_SHOPS_NAME_TEXT)
slotName.SetPackedFontColor(0xfff4ead5)
slotName.Show()
slotOffer = ui.TextLine()
slotOffer.SetParent(self.background)
slotOffer.SetPosition(115, 60)
slotOffer.SetText(localeInfo.OFFLINESHOP_OFFER_TEXT)
slotOffer.SetPackedFontColor(0xfff4ead5)
slotOffer.Show()
self.slotName = slotName
self.slotOffer = slotOffer
slot1 = ui.SlotBar_RB()
slot1.SetParent(self.background)
slot1.SetPosition(55, 25)
slot1.SetSize(140, 20)
slot1.SetColor(0xff2A2522, 0xff433B38, 0xff000000)
slot1.Show()
slot2 = ui.SlotBar_RB()
slot2.SetParent(self.background)
slot2.SetPosition(55, 75)
slot2.SetSize(140, 20)
slot2.SetColor(0xff2A2522, 0xff433B38, 0xff000000)
slot2.Show()
self.slot1 = slot1
self.slot2 = slot2
def __LoadOwnerName(self):
text = ui.TextLine()
text.SetParent(self.slot1)
text.SetPosition(3, 3)
text.SetText(self.info.get('shop_name', ""))
text.Show()
self.ownerName = text
def __LoadOfferText(self):
text = ui.TextLine()
text.SetParent(self.slot2)
text.SetPosition(3, 3)
text.SetText(NumberToString(self.info.get('price', "")))
text.Show()
self.offerText = text
def __LoadSlot(self):
slot = Slot(self.info['is_accept'])
slot.SetInfo(self.info['item'])
slot.SetParent(self.background)
slot.SetPosition(9,4)
slot.Show()
self.slot = slot
def __LoadCancelButton(self):
button = ui.Button()
button.SetParent(self.background)
button.SetPosition(185, 1)
button.SetUpVisual("offlineshop/myoffers/deleteoffer_default.png")
button.SetDownVisual("offlineshop/myoffers/deleteoffer_down.png")
button.SetOverVisual("offlineshop/myoffers/deleteoffer_over.png")
button.Show()
button.SAFE_SetEvent(self.__OnClickCancelButton)
self.cancelButton = button
def SetCancelButtonEvent(self, event):
self.cancelButtonEvent = event
def __OnClickCancelButton(self):
if self.cancelButtonEvent:
self.cancelButtonEvent(self.info['offer_id'])
def IsInSlot(self):
return self.slot.IsInSlot()
def GetIndex(self):
return self.info['offer_id']
#updated 25-01-2020 #topatch
def DisableCancelButton(self):
if self.cancelButton:
self.cancelButton.Hide()
class AuctionListElement(ui.Window):
def __init__(self, info):
ui.Window.__init__(self)
self.ownerName = None
self.durationText = None
self.offerCountText = None
self.owner_id = -1
self.info = info
self.button = None
self.buttonEvent = None
self.bestYangText = None
self.__LoadWindow(info)
def __del__(self):
self.ownerName = None
self.durationText = None
self.offerCountText = None
self.owner_id = -1
self.info = {}
self.button = None
self.buttonEvent = None
self.bestYangText = None
ui.Window.__del__(self)
def __LoadWindow(self, info):
owner_id = info["owner_id"]
duration = info["duration"]
count = info["offer_count"]
name = info["owner_name"]
best_yang = info['best_yang']
self.owner_id = owner_id
self.__LoadOpenAuctionButton()
self.__LoadOwnerName(name)
self.__LoadDuration(duration)
self.__LoadCount(count)
self.__LoadBestYang(best_yang)
def SetIndex(self,index):
self.owner_id = index
def GetIndex(self):
return self.owner_id
def GetInfo(self):
return self.info
def SetOnClickOpenShopButton(self, event):
self.openShopButton.SAFE_SetEvent(self.__OnClickOpenShop)
self.openShopButtonEvent = event
def __LoadOwnerName(self, ownerName):
if not ownerName:
return
text = ui.TextLine()
text.SetParent(self.button)
text.SetPosition(48, 5)
text.SetHorizontalAlignCenter()
text.SetText(ownerName)
text.Show()
self.ownerName = text
def __LoadBestYang(self, yang):
text = ui.TextLine()
text.SetParent(self.button)
text.SetPosition(198 , 5)
text.SetHorizontalAlignCenter()
text.SetText(localeInfo.NumberToMoneyString(yang))
text.Show()
self.bestYangText = text
def __LoadDuration(self, duration):
text = ui.TextLine()
text.SetParent(self.button)
text.SetPosition(358 , 5)
text.SetHorizontalAlignCenter()
text.SetText(GetDurationString(duration))
text.Show()
self.durationText = text
def __LoadCount(self, count):
text = ui.TextLine()
text.SetParent(self.button)
text.SetPosition(510 , 5)
text.SetHorizontalAlignCenter()
text.SetText(str(count))
text.Show()
self.offerCountText = text
def SetOnClickOpenAuctionButton(self, event):
self.button.SAFE_SetEvent(self.__OnClickMe)
self.buttonEvent = event
def __OnClickMe(self):
if self.buttonEvent:
self.buttonEvent(self.owner_id)
def __LoadOpenAuctionButton(self):
button = ui.Button()
button.SetParent(self)
button.SetUpVisual("scripts/offlineshop/data_input_2_norm.png")
button.SetDownVisual("scripts/offlineshop/data_input_2_down.png")
button.SetOverVisual("scripts/offlineshop/data_input_2_over.png")
button.SetPosition(0, 0)
button.Show()
self.SetSize(button.GetWidth(), button.GetHeight())
self.button = button
def IsInSlot(self):
if self.IsIn():
return True
if self.ownerName:
if self.ownerName.IsIn():
return True
if self.durationText:
if self.durationText.IsIn():
return True
if self.offerCountText:
if self.offerCountText.IsIn():
return True
if self.button:
if self.button.IsIn():
return True
return False
class ShopListElement(ui.Window):
def __init__(self , info):
ui.Window.__init__(self)
self.ownerName = None
self.shopName = None
self.durationText = None
self.countText = None
self.openShopButton = None
self.openShopButtonEvent = None
self.owner_id = -1
self.__LoadWindow(info)
def __del__(self):
self.ownerName = None
self.shopName = None
self.durationText = None
self.countText = None
self.openShopButton = None
self.openShopButtonEvent = None
self.owner_id = -1
ui.Window.__del__(self)
def __LoadWindow(self, info):
owner_id = info["owner_id"]
duration = info["duration"]
count = info["count"]
name = info["name"]
ownerName = name[:name.find('@')] if '@' in name else "NONAME"
name = name[name.find('@')+1:] if '@' in name else name
self.owner_id = owner_id
self.__LoadOpenShopButton()
self.__LoadOwnerName(ownerName)
self.__LoadShopName(name)
self.__LoadDuration(duration)
self.__LoadCount(count)
def SetOnClickOpenShopButton(self, event):
self.openShopButton.SAFE_SetEvent(self.__OnClickOpenShop)
self.openShopButtonEvent = event
def __OnClickOpenShop(self):
if self.openShopButtonEvent:
self.openShopButtonEvent(self.owner_id)
def __LoadOpenShopButton(self):
button = ui.Button()
button.SetParent(self)
button.SetUpVisual("scripts/offlineshop/data_input_2_norm.png")
button.SetDownVisual("scripts/offlineshop/data_input_2_down.png")
button.SetOverVisual("scripts/offlineshop/data_input_2_over.png")
button.SetPosition(0, 0)
button.Show()
self.SetSize(button.GetWidth(), button.GetHeight())
self.openShopButton = button
def __LoadOwnerName(self ,ownerName):
if not ownerName:
return
text = ui.TextLine()
text.SetParent(self.openShopButton)
text.SetPosition(48 , 5)
text.SetHorizontalAlignCenter()
text.SetText(ownerName)
text.Show()
self.ownerName = text
def __LoadShopName(self ,name):
text = ui.TextLine()
text.SetParent(self.openShopButton)
text.SetPosition(198 , 5)
text.SetHorizontalAlignCenter()
text.SetText(name)
text.Show()
self.shopName = text
def __LoadDuration(self ,duration):
text = ui.TextLine()
text.SetParent(self.openShopButton)
text.SetPosition(358 , 5)
text.SetHorizontalAlignCenter()
text.SetText(GetDurationString(duration))
text.Show()
self.durationText = text
def __LoadCount(self ,count):
text = ui.TextLine()
text.SetParent(self.openShopButton)
text.SetPosition(510 , 5)
text.SetHorizontalAlignCenter()
text.SetText(str(count))
text.Show()
self.countText = text
class Suggestions():
def __init__(self):
self.inputBox = None
self.comboBox = None
self.mainDict = {}
self.tempDict = {}
self.isRefreshing = False
self.isSelecting = False
def SetInputBox(self, box):
box.OnIMEUpdate = self.__OnUpdateInputBox
self.inputBox = box
def SetComboBox(self, box):
box.SetEvent(ui.__mem_func__(self.__OnSelectItem))
box.ClearItem()
box.SetCurrentItem(localeInfo.OFFLINESHOP_NAME_SUGGESTION_UNSELECT)
self.comboBox = box
def SetMainDict(self, inDict):
def getUnrefined(st):
pos = st.find('+')
if pos == -1:
return st
if pos > len(st) -4 and pos > 4:
return st[:pos]
return st
cleanDict = {}
inserted = []
for name , vnum in inDict.items():
unrefined = getUnrefined(name).lower().strip()
if unrefined in inserted:
continue
cleanDict[unrefined] = vnum
inserted.append(unrefined)
self.mainDict = cleanDict
def __OnUpdateInputBox(self):
snd.PlaySound("sound/ui/type.wav")
ui.TextLine.SetText(self.inputBox, ime.GetText(self.inputBox.bCodePage))
self.__RefreshComboBox()
def __RefreshComboBox(self):
if self.isSelecting:
return
self.isRefreshing = True
self.tempDict = {}
inputText = self.inputBox.GetText().lower().strip()
if len(inputText) < 3:
return
self.comboBox.ClearItem()
self.comboBox.SetCurrentItem(localeInfo.OFFLINESHOP_NAME_SUGGESTION_UNSELECT)
idx = 0
for k,v in self.mainDict.items():
if inputText in k.lower():
self.tempDict[idx] = k
self.comboBox.InsertItem(idx, k)
idx += 1
if idx == 20:
break
self.isRefreshing = False
def __OnSelectItem(self, index):
if self.isRefreshing:
return
self.isSelecting = True
self.inputBox.SetText(self.tempDict[index])
self.isSelecting = False
def __del__(self):
self.inputBox = None
self.comboBox = None
self.mainDict = {}
self.tempDict = {}
def Clear(self):
self.comboBox.ClearItem()
self.comboBox.SetCurrentItem(localeInfo.OFFLINESHOP_NAME_SUGGESTION_UNSELECT)
class SuggestionElement(ui.Button):
def __init__(self):
self.clickEvent = None
self.index = 0
ui.Button.__init__(self)
def __del__(self):
self.clickEvent = None
ui.Button.__del__(self)
def SetClickEvent(self, event):
self.clickEvent = event
self.SAFE_SetEvent(self.__OnClickMe)
def __OnClickMe(self):
if self.clickEvent:
self.clickEvent(self.index)
def SetElement(self, index, text):
self.index = index
self.SetText(text)
class SuggestionSelector(ui.Window):
def __init__(self):
ui.Window.__init__(self)
self.scrollbar = None
self.background = None
self.attributeDict = {}
self.onSelectEvent = None
self.elements = []
self.__loadBackground()
self.__loadElements()
self.__loadScrollbar()
def __loadBackground(self):
bg = ui.ImageBox()
bg.LoadImage("scripts/offlineshop/attribute_data_background.png")
bg.SetParent(self)
bg.SetPosition(0,-1)
bg.Show()
self.background = bg
self.SetSize(bg.GetWidth() , bg.GetHeight())
def __loadElements(self):
for x in xrange(6):
element = SuggestionElement()
element.SetParent(self.background)
element.SetPosition(0, x * 23)
path = "scripts/offlineshop/"
element.SetUpVisual(path + "ss_input_norm.png")
element.SetDownVisual(path +"ss_input_down.png")
element.SetOverVisual(path + "ss_input_hover.png")
element.Show()
element.SetClickEvent(self.__OnSelectAttribute)
self.elements.append(element)
def __loadScrollbar(self):
scroll = ui.ShopScrollBar()
scroll.SetParent(self.background)
scroll.SetPosition(self.GetWidth()-6, 0)
scroll.SetScrollBarSize(self.GetHeight())
scroll.SetScrollEvent(self.__OnScroll)
scroll.Show()
self.scrollbar = scroll
def __OnSelectAttribute(self, index):
if self.onSelectEvent:
self.onSelectEvent(index)
def __OnScroll(self):
self.__refreshViewList()
# if app.ENABLE_WHEEL_MOUSE: #EDW
# def OnRunMouseWheel(self, nLen):
# if self.scrollbar:
# self.scrollbar.OnRunMouseWheel(nLen)
def __refreshViewList(self):
pos = self.scrollbar.GetPos()
initIndex = int(pos * (len(self.attributeDict) - len(self.elements) ))
for x in xrange(initIndex , initIndex + len(self.elements)):
index = self.attributeDict.keys()[x]
text = self.attributeDict[index]
self.elements[x-initIndex].SetElement(index, text)
def SetAttributeDict(self, dct):
self.attributeDict = dct
self.__refreshViewList()
def SetSelectEvent(self, event):
self.onSelectEvent = event
def __del__(self):
self.background = None
self.elements = []
self.scrollbar = None
self.onSelectEvent = None
ui.Window.__del__(self)
class FilterHistoryElement(ui.Window):
def __init__(self, info):
ui.Window.__init__(self)
self.button = None
self.datetext = None
self.timetext = None
self.counttext = None
self.buttonEvent = None
self.info = {}
self.__loadButton()
self.__loadDateText(info)
self.__loadTimeText(info)
self.__loadCountText(info)
self.info = info
def GetInfo(self):
return self.info
def SetButtonEvent(self , event):
self.buttonEvent = event
self.button.SAFE_SetEvent(self.__OnClickMe)
def __OnClickMe(self):
if self.buttonEvent:
self.buttonEvent(self)
def __loadButton(self):
button = ui.Button()
button.SetParent(self)
button.SetPosition(0,0)
path = "scripts/offlineshop/data_input_2_%s.png"
button.SetUpVisual(path%"norm")
button.SetDownVisual(path%"down")
button.SetOverVisual(path%"over")
button.Show()
self.SetSize(button.GetWidth(), button.GetHeight())
self.button = button
def __loadDateText(self,info):
text = ui.TextLine()
text.SetParent(self.button)
text.SetPosition(60, 5)
day = info["day"]
month = info["month"]
year = info["year"]
text.SetText("%02d - %02d - %d "%(day, month, year))
text.Show()
self.datetext = text
def __loadTimeText(self, info):
text = ui.TextLine()
text.SetParent(self.button)
text.SetPosition(190+75, 5)
hour = info["hour"]
minute = info["minute"]
text.SetText("%02d : %02d " % (hour, minute))
text.Show()
self.timetext = text
def __loadCountText(self, info):
text = ui.TextLine()
text.SetParent(self.button)
text.SetPosition(485, 5)
count = info["count"]
text.SetText(" %d " % (count))
text.SetHorizontalAlignCenter()
text.Show()
self.counttext = text
def __del__(self):
self.button = None
self.datetext = None
self.timetext = None
self.counttext = None
self.buttonEvent= None
ui.Window.__del__(self)
def IsInSlot(self):
if not self.IsShow():
return False
if self.IsIn():
return True
if self.button:
if self.button.IsIn():
return True
if self.datetext:
if self.datetext.IsIn():
return True
if self.timetext:
if self.timetext.IsIn():
return True
if self.counttext:
if self.counttext.IsIn():
return True
return False
def GetIndex(self):
return self.info['id']
class FilterPatternElement(ui.Window):
def __init__(self, info):
ui.Window.__init__(self)
self.button = None
self.datetext = None
self.nametext = None
self.buttonEvent = None
self.info = {}
self.__loadButton()
self.__loadDateText(info)
self.__loadNameText(info)
self.info = info
def GetInfo(self):
return self.info
def SetButtonEvent(self , event):
self.buttonEvent = event
self.button.SAFE_SetEvent(self.__OnClickMe)
def __OnClickMe(self):
if self.buttonEvent:
self.buttonEvent(self)
def __loadButton(self):
button = ui.Button()
button.SetParent(self)
button.SetPosition(0,0)
path = "scripts/offlineshop/data_input_2_%s.png"
button.SetUpVisual(path%"norm")
button.SetDownVisual(path%"down")
button.SetOverVisual(path%"over")
button.Show()
self.SetSize(button.GetWidth(), button.GetHeight())
self.button = button
def __loadDateText(self,info):
text = ui.TextLine()
text.SetParent(self.button)
text.SetPosition(380, 5)
day = info["day"]
month = info["month"]
year = info["year"]
hour = info["hour"]
minute = info["minute"]
text.SetText("%02d - %02d - %d %02d : %02d"%(day, month, year, hour, minute))
text.Show()
self.datetext = text
def __loadNameText(self, info):
text = ui.TextLine()
text.SetParent(self.button)
text.SetPosition(48, 5)
text.SetText(info["name"])
text.Show()
self.nametext = text
def __del__(self):
self.button = None
self.datetext = None
self.nametext = None
self.buttonEvent = None
ui.Window.__del__(self)
def IsInSlot(self):
if not self.IsShow():
return False
if self.IsIn():
return True
if self.button:
if self.button.IsIn():
return True
if self.datetext:
if self.datetext.IsIn():
return True
if self.nametext:
if self.nametext.IsIn():
return True
return False
def GetIndex(self):
return self.info['id']
class NewOfflineShopBoard(ui.ScriptWindow):
MAX_CATEGORY_ITEMS = 13
#constants
BOARD_KEYS = ("create_shop" , "my_shop", "open_shop", "shop_list", "search_history", )
ITEM_TYPES = {
item.ITEM_TYPE_NONE : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET,
},
item.ITEM_TYPE_WEAPON : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_WEAPON,
"subtypes" : {
item.WEAPON_SWORD : localeInfo.OFFLINESHOP_COMBOBOX_WEAPON_SWORD,
item.WEAPON_DAGGER : localeInfo.OFFLINESHOP_COMBOBOX_WEAPON_DAGGER,
item.WEAPON_BOW : localeInfo.OFFLINESHOP_COMBOBOX_WEAPON_BOW,
item.WEAPON_TWO_HANDED : localeInfo.OFFLINESHOP_COMBOBOX_WEAPON_TWO_HANDED,
item.WEAPON_BELL : localeInfo.OFFLINESHOP_COMBOBOX_WEAPON_BELL,
item.WEAPON_FAN : localeInfo.OFFLINESHOP_COMBOBOX_WEAPON_FAN,
},
},
item.ITEM_TYPE_ARMOR : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_ARMOR,
"subtypes" : {
item.ARMOR_BODY : localeInfo.OFFLINESHOP_COMBOBOX_ARMOR_BODY,
item.ARMOR_HEAD : localeInfo.OFFLINESHOP_COMBOBOX_ARMOR_HEAD,
item.ARMOR_SHIELD : localeInfo.OFFLINESHOP_COMBOBOX_ARMOR_SHIELD,
item.ARMOR_WRIST : localeInfo.OFFLINESHOP_COMBOBOX_ARMOR_WRIST,
item.ARMOR_FOOTS : localeInfo.OFFLINESHOP_COMBOBOX_ARMOR_FOOTS,
item.ARMOR_NECK : localeInfo.OFFLINESHOP_COMBOBOX_ARMOR_NECK,
item.ARMOR_EAR : localeInfo.OFFLINESHOP_COMBOBOX_ARMOR_EAR,
},
},
item.ITEM_TYPE_METIN : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_METIN,
},
item.ITEM_TYPE_FISH : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_FISH,
},
item.ITEM_TYPE_SKILLBOOK : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_SKILLBOOK,
},
# item.ITEM_PET : { #EDW
# "name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_BLEND,
# },
item.ITEM_TYPE_DS : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_DS,
},
item.ITEM_TYPE_RING : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_RING,
},
item.ITEM_TYPE_BELT : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_BELT,
},
item.ITEM_TYPE_METIN : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_METIN,
},
23 : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_GIFTBOX,
},
item.ITEM_TYPE_COSTUME : {
"name" : localeInfo.OFFLINESHOP_TYPE_COMBOBOX_COSTUME,
"subtypes" : {
item.COSTUME_TYPE_BODY : localeInfo.OFFLINESHOP_COMBOBOX_COSTUME_BODY,
item.COSTUME_TYPE_HAIR : localeInfo.OFFLINESHOP_COMBOBOX_COSTUME_HAIR,
item.COSTUME_TYPE_MOUNT : localeInfo.OFFLINESHOP_COMBOBOX_COSTUME_MOUNT,
item.COSTUME_TYPE_ACCE : localeInfo.OFFLINESHOP_COMBOBOX_COSTUME_ACCE,
item.COSTUME_TYPE_WEAPON : localeInfo.OFFLINESHOP_COMBOBOX_COSTUME_WEAPON,
},
},
item.ITEM_TYPE_MATERIAL :{
"name": localeInfo.OFFLINESHOP_TYPE_COMBOBOX_REFINE,
},
}
ATTRIBUTES = {
0 : localeInfo.OFFLINESHOP_ATTR_UNSET,
item.APPLY_MAX_HP : localeInfo.OFFLINESHOP_ATTR_MAX_HP,
item.APPLY_MAX_SP : localeInfo.OFFLINESHOP_ATTR_MAX_SP,
item.APPLY_CON : localeInfo.OFFLINESHOP_ATTR_CON,
item.APPLY_INT : localeInfo.OFFLINESHOP_ATTR_INT,
item.APPLY_STR : localeInfo.OFFLINESHOP_ATTR_STR,
item.APPLY_DEX : localeInfo.OFFLINESHOP_ATTR_DEX,
item.APPLY_ATT_SPEED : localeInfo.OFFLINESHOP_ATTR_ATT_SPEED,
item.APPLY_MOV_SPEED : localeInfo.OFFLINESHOP_ATTR_MOV_SPEED,
item.APPLY_CAST_SPEED : localeInfo.OFFLINESHOP_ATTR_CAST_SPEED,
item.APPLY_HP_REGEN : localeInfo.OFFLINESHOP_ATTR_HP_REGEN,
item.APPLY_SP_REGEN : localeInfo.OFFLINESHOP_ATTR_SP_REGEN,
item.APPLY_POISON_PCT : localeInfo.OFFLINESHOP_ATTR_APPLY_POISON_PCT,
item.APPLY_STUN_PCT : localeInfo.OFFLINESHOP_ATTR_APPLY_STUN_PCT,
item.APPLY_SLOW_PCT : localeInfo.OFFLINESHOP_ATTR_APPLY_SLOW_PCT,
item.APPLY_CRITICAL_PCT : localeInfo.OFFLINESHOP_ATTR_APPLY_CRITICAL_PCT,
item.APPLY_PENETRATE_PCT : localeInfo.OFFLINESHOP_ATTR_APPLY_PENETRATE_PCT,
item.APPLY_ATTBONUS_WARRIOR : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_WARRIOR,
item.APPLY_ATTBONUS_ASSASSIN : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_ASSASSIN,
item.APPLY_ATTBONUS_SURA : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_SURA,
item.APPLY_ATTBONUS_SHAMAN : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_SHAMAN,
item.APPLY_ATTBONUS_MONSTER : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_MONSTER,
item.APPLY_ATTBONUS_HUMAN : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_HUMAN,
item.APPLY_ATTBONUS_ANIMAL : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_ANIMAL,
item.APPLY_ATTBONUS_ORC : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_ORC,
item.APPLY_ATTBONUS_MILGYO : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_MILGYO,
item.APPLY_ATTBONUS_UNDEAD : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_UNDEAD,
item.APPLY_ATTBONUS_DEVIL : localeInfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_DEVIL,
item.APPLY_STEAL_HP : localeInfo.OFFLINESHOP_ATTR_APPLY_STEAL_HP,
item.APPLY_STEAL_SP : localeInfo.OFFLINESHOP_ATTR_APPLY_STEAL_SP,
item.APPLY_MANA_BURN_PCT : localeInfo.OFFLINESHOP_ATTR_APPLY_MANA_BURN_PCT,
item.APPLY_DAMAGE_SP_RECOVER : localeInfo.OFFLINESHOP_ATTR_APPLY_DAMAGE_SP_RECOVER,
item.APPLY_BLOCK : localeInfo.OFFLINESHOP_ATTR_APPLY_BLOCK,
item.APPLY_DODGE : localeInfo.OFFLINESHOP_ATTR_APPLY_DODGE,
item.APPLY_RESIST_SWORD : localeInfo.OFFLINESHOP_ATTR_APPLY_RESIST_SWORD,
item.APPLY_RESIST_TWOHAND : localeInfo.OFFLINESHOP_ATTR_APPLY_RESIST_TWOHAND,
item.APPLY_RESIST_DAGGER : localeInfo.OFFLINESHOP_ATTR_APPLY_RESIST_DAGGER,
item.APPLY_RESIST_BELL : localeInfo.OFFLINESHOP_ATTR_APPLY_RESIST_BELL,
item.APPLY_RESIST_FAN : localeInfo.OFFLINESHOP_ATTR_APPLY_RESIST_FAN,
item.APPLY_RESIST_BOW : localeInfo.OFFLINESHOP_ATTR_RESIST_BOW,
item.APPLY_RESIST_FIRE : localeInfo.OFFLINESHOP_ATTR_RESIST_FIRE,
item.APPLY_RESIST_ELEC : localeInfo.OFFLINESHOP_ATTR_RESIST_ELEC,
item.APPLY_RESIST_MAGIC : localeInfo.OFFLINESHOP_ATTR_RESIST_MAGIC,
item.APPLY_RESIST_WIND : localeInfo.OFFLINESHOP_ATTR_APPLY_RESIST_WIND,
item.APPLY_REFLECT_MELEE : localeInfo.OFFLINESHOP_ATTR_APPLY_REFLECT_MELEE,
item.APPLY_POISON_REDUCE : localeInfo.OFFLINESHOP_ATTR_APPLY_POISON_REDUCE,
item.APPLY_EXP_DOUBLE_BONUS : localeInfo.OFFLINESHOP_ATTR_APPLY_EXP_DOUBLE_BONUS,
item.APPLY_GOLD_DOUBLE_BONUS : localeInfo.OFFLINESHOP_ATTR_APPLY_GOLD_DOUBLE_BONUS,
item.APPLY_ITEM_DROP_BONUS : localeInfo.OFFLINESHOP_ATTR_APPLY_ITEM_DROP_BONUS,
item.APPLY_IMMUNE_STUN : localeInfo.OFFLINESHOP_ATTR_APPLY_IMMUNE_STUN,
item.APPLY_IMMUNE_SLOW : localeInfo.OFFLINESHOP_ATTR_APPLY_IMMUNE_SLOW,
item.APPLY_IMMUNE_FALL : localeInfo.OFFLINESHOP_ATTR_APPLY_IMMUNE_FALL,
item.APPLY_DEF_GRADE_BONUS : localeInfo.OFFLINESHOP_ATTR_DEF_GRADE,
item.APPLY_ATT_GRADE_BONUS : localeInfo.OFFLINESHOP_ATTR_ATT_GRADE,
item.APPLY_MAGIC_ATT_GRADE : localeInfo.OFFLINESHOP_ATTR_MAGIC_ATT_GRADE,
item.APPLY_MAGIC_DEF_GRADE : localeInfo.OFFLINESHOP_ATTR_MAGIC_DEF_GRADE,
item.APPLY_SKILL_DAMAGE_BONUS : localeInfo.OFFLINESHOP_ATTR_SKILL_DAMAGE_BONUS,
item.APPLY_NORMAL_HIT_DAMAGE_BONUS : localeInfo.OFFLINESHOP_ATTR_NORMAL_HIT_DAMAGE_BONUS,
item.APPLY_SKILL_DEFEND_BONUS : localeInfo.OFFLINESHOP_ATTR_SKILL_DEFEND_BONUS,
item.APPLY_NORMAL_HIT_DEFEND_BONUS : localeInfo.OFFLINESHOP_ATTR_NORMAL_HIT_DEFEND_BONUS,
item.APPLY_MAGIC_ATTBONUS_PER : localeInfo.OFFLINESHOP_ATTR_MAGIC_ATTBONUS_PER,
item.APPLY_MELEE_MAGIC_ATTBONUS_PER : localeInfo.OFFLINESHOP_ATTR_MELEE_MAGIC_ATTBONUS_PER,
item.APPLY_RESIST_ICE : localeInfo.OFFLINESHOP_ATTR_RESIST_ICE,
item.APPLY_RESIST_EARTH : localeInfo.OFFLINESHOP_ATTR_RESIST_EARTH,
item.APPLY_RESIST_DARK : localeInfo.OFFLINESHOP_ATTR_RESIST_DARK,
item.APPLY_ANTI_CRITICAL_PCT : localeInfo.OFFLINESHOP_ATTR_ANTI_CRITICAL_PCT,
item.APPLY_ANTI_PENETRATE_PCT : localeInfo.OFFLINESHOP_ATTR_ANTI_PENETRATE_PCT,
# NEW BONUS
# item.APPLY_ATTBONUS_SEFI : localeInfo.SWITCHBOOT_TOOLTIP_APPLY_ATTBONUS_SEFI, #EDW
item.APPLY_ATTBONUS_STONE : localeInfo.TOOLTIP_ATTBONUS_STONE,
# END
}
if app.ENABLE_ELEMENT_ADD:
ATTRIBUTES.update({
item.APPLY_ENCHANT_ELEC : localeInfo.TOOLTIP_APPLY_ENCHANT_ELECT,
item.APPLY_ENCHANT_FIRE : localeInfo.TOOLTIP_APPLY_ENCHANT_FIRE,
item.APPLY_ENCHANT_ICE : localeInfo.TOOLTIP_APPLY_ENCHANT_ICE,
item.APPLY_ENCHANT_WIND : localeInfo.TOOLTIP_APPLY_ENCHANT_WIND,
item.APPLY_ENCHANT_EARTH : localeInfo.TOOLTIP_APPLY_ENCHANT_EARTH,
item.APPLY_ENCHANT_DARK : localeInfo.TOOLTIP_APPLY_ENCHANT_DARK,
item.APPLY_ATTBONUS_CZ : localeInfo.TOOLTIP_APPLY_ATTBONUS_CZ,
item.APPLY_ATTBONUS_INSECT : localeInfo.TOOLTIP_APPLY_ATTBONUS_INSECT,
item.APPLY_ATTBONUS_DESERT : localeInfo.TOOLTIP_APPLY_ATTBONUS_DESERT,
})
if app.ENABLE_PENDANT:
ATTRIBUTES.update({
item.APPLY_RESIST_SWORD_REDUCTION : localeInfo.TOOLTIP_APPLY_ATTBONUS_SWORD,
item.APPLY_RESIST_TWOHAND_REDUCTION : localeInfo.TOOLTIP_APPLY_ATTBONUS_TWOHAND,
item.APPLY_RESIST_DAGGER_REDUCTION : localeInfo.TOOLTIP_APPLY_ATTBONUS_DAGGER,
item.APPLY_RESIST_BELL_REDUCTION : localeInfo.TOOLTIP_APPLY_ATTBONUS_BELL,
item.APPLY_RESIST_FAN_REDUCTION : localeInfo.TOOLTIP_APPLY_ATTBONUS_FAN,
item.APPLY_RESIST_BOW_REDUCTION : localeInfo.TOOLTIP_APPLY_ATTBONUS_BOW,
item.APPLY_RESIST_HUMAN : localeInfo.TOOLTIP_APPLY_RESIST_HUMAN,
#item.APPLY_RESIST_MOUNT_FALL : localeInfo.SWITCHBOOT_TOOLTIP_APPLY_RESIST_MOUNT_FALL, #EDW
})
# if app.ENABLE_HYDRA_DUNGEON: #EDW
# ATTRIBUTES.update({
# item.APPLY_ATTBONUS_HYDRA : localeInfo.SWITCHBOOT_TOOLTIP_APPLY_ATTBONUS_HYDRA,
# })
## END
if not app.DISABLE_WOLFMAN_CREATION:
ATTRIBUTES.update({
item.APPLY_BLEEDING_PCT : localeInfo.OFFLINESHOP_ATTR_APPLY_BLEEDING_PCT,
item.APPLY_BLEEDING_REDUCE : localeInfo.OFFLINESHOP_ATTR_APPLY_BLEEDING_REDUCE,
})
if app.ENABLE_MAGIC_REDUCTION:
ATTRIBUTES.update({
item.APPLY_RESIST_MAGIC_REDUCTION : localeInfo.OFFLINESHOP_ATTR_RESIST_MAGIC_REDUCTION,
})
def __init__(self):
ui.ScriptWindow.__init__(self)
self.clear()
offlineshop.SetOfflineshopBoard(self)
self.__loadWindow()
def clear(self):
self.MyShopButton = None
self.ListOfShopButton = None
self.SearchFilterButton = None
self.SearchHistoryButton = None
self.MyPatternsButton = None
self.MyAuctionButton = None
self.ListOfAuctionsButton = None
self.pageBoards = {}
self.pageCategory = "my_shop"
self.updateEvents = {}
self.itemTooltip = None
self.popupMessage = None
self.ShopItemForSale = []
self.ShopItemSold = []
self.EditPriceSlot = None
self.AddItemSlotIndex = -1
self.CommonInputPriceDlg = None
self.CommonQuestionDlg = None
self.CommonPickValuteDlg = None
self.TitleBar = None
self.SearchFilterShopItemResult = []
self.FilterHistory = []
self.FilterPatterns = {}
self.ShopList = []
self.ShopOpenInfo = {}
self.ShopListTable = None
self.InsertedItems = []
self.CreateShopNameEdit = None
self.CreateShopDaysCountText = None
self.CreateShopHoursCountText = None
self.CreateShopItemsTable = None
self.CreateShopItemsInfos = {}
self.MyShopItemsTable = None
self.MyShopShopTitle = None
self.MyShopShopDuration = None
self.MyShopCloseButton = None
self.MyShopEditNameDlg = None
self.MyShopOffers = None
self.MyShopOffersTable = None
self.OpenShopItemsTable = None
self.OpenShopBackToListButton = None
self.OpenShopShopTitle = None
self.OpenShopShopDuration = None
self.OpenShopBuyItemID = -1
self.SearchFilterItemsNameDict = {}
self.SearchFilterCheckBoxesRace = {}
self.SearchFilterCheckBoxes = {}
self.SearchFilterComboBoxSuggestion = None
self.SearchFilterSuggestionObj = None
self.SearchFilterItemNameInput = None
self.SearchFilterResetFilterButton = None
self.SearchFilterSavePatternButton = None
self.SearchFilterStartSearch = None
self.MainScrollBar = None
self.SearchFilterResultItemsTable = None
self.SearchHistoryTable = None
self.SearchPatternsTable = None
self.SearchPatternsInputNameDlg = None
self.ShopSafeboxItems = []
self.ShopSafeboxItemsTable = None
self.ShopSafeboxValuteAmount=0
self.ShopSafeboxValuteText = None
self.ShopSafeboxWithdrawYangButton = None
self.MyOffersList = None
self.MyOffersTable = None
self.MyAuctionInfo = {}
self.MyAuctionOffers = []
self.MyAuctionOfferTable = None
self.MyAuctionOwnerName = None
self.MyAuctionDuration = None
self.MyAuctionBestOffer = None
self.MyAuctionMinRaise = None
self.MyAuctionSlot = None
self.OpenAuctionInfo = {}
self.OpenAuctionOffers = []
self.OpenAuctionOfferTable = None
self.OpenAuctionBackToListButton = None
self.OpenAuctionOwnerName = None
self.OpenAuctionDuration = None
self.OpenAuctionBestOffer = None
self.OpenAuctionMinRaise = None
self.OpenAuctionSlot = None
self.AuctionListInfo = {}
self.AuctionListTable = None
self.CreateAuctionCreateAuctionButton = None
self.CreateAuctionDaysInput = None
self.CreateAuctionStartingPriceInput = None
self.CreateAuctionSlot = None
self.CreateAuctionDaysIncreaseButton = None
self.CreateAuctionDaysDecreaseButton = None
self.RefreshSymbol = None
def Destroy(self):
self.Hide()
self.clear()
self.ClearDictionary()
def OnPressEscapeKey(self):
self.Close()
return True
def __del__(self):
self.Destroy()
print("------------ DESTROYED OFFLINESHOP INTERFACE ------------")
ui.ScriptWindow.__del__(self)
def __loadWindow(self):
pyLoader = ui.PythonScriptLoader()
pyLoader.LoadScriptFile(self , "uiscript/offlineshopwindow.py")
childDict = {
"create_shop" : "MyShopBoardNoShop",
"my_shop" : "MyShopBoard",
"open_shop" : "ListOfShop_OpenShop",
"shop_list" : "ListOfShop_List",
"shop_safebox" : "ShopSafeboxPage",
"my_offers" : "MyOffersPage",
"search_history" : "SearchHistoryBoard",
"my_patterns" : "MyPatternsBoard",
"search_filter" : "SearchFilterBoard",
"my_auction" : "MyAuction",
"auction_list" : "AuctionList",
"open_auction" : "OpenAuction",
"create_auction" : "CreateAuction",
}
self.pageBoards = {}
for k, v in childDict.items():
self.pageBoards[k] = self.GetChild(v)
self.pageBoards[k].Hide()
#refresh symbol
self.RefreshSymbol = self.GetChild("AnimationWindow")
self.CreateShopNameEdit = self.GetChild("ShopNameInput")
self.CreateShopDaysCountText = self.GetChild("DaysCountText")
self.CreateShopHoursCountText = self.GetChild("HoursCountText")
self.CreateShopIncreaseDaysButton = self.GetChild("IncreaseDaysButton")
self.CreateShopDecreaseDaysButton = self.GetChild("DecreaseDaysButton")
self.CreateShopIncreaseHoursButton = self.GetChild("IncreaseHoursButton")
self.CreateShopDecreaseHoursButton = self.GetChild("DecreaseHoursButton")
self.CreateShopButton = self.GetChild("CreateShopButton")
self.CreateShopIncreaseDaysButton.SAFE_SetEvent(self.__OnClickCreateShopIncreaseDaysButton)
self.CreateShopDecreaseDaysButton.SAFE_SetEvent(self.__OnClickCreateShopDecreaseDaysButton)
self.CreateShopIncreaseHoursButton.SAFE_SetEvent(self.__OnClickCreateShopIncreaseHoursButton)
self.CreateShopDecreaseHoursButton.SAFE_SetEvent(self.__OnClickCreateShopDecreaseHoursButton)
self.CreateShopButton.SAFE_SetEvent(self.__OnClickCreateShopButton)
self.__MakeCreateShopItemsTable()
self.MyShopShopDuration = self.GetChild("MyShopShopDuration")
self.MyShopShopTitle = self.GetChild("MyShopShopTitle")
self.MyShopCloseButton = self.GetChild("MyShopCloseButton")
self.MyShopEditTitleButton = self.GetChild("MyShopEditTitleButton")
self.__MakeMyShopItemsTable()
self.__MakeMyShopOffersTable()
self.MyShopCloseButton.SAFE_SetEvent(self.__OnClickCloseButton)
self.MyShopEditTitleButton.SAFE_SetEvent(self.__OnClickMyShopEditNameButton)
self.MyShopEditNameDlg = uiCommon.InputDialogWithDescription()
self.MyShopEditNameDlg.SetMaxLength(35)
self.MyShopEditNameDlg.SetDescription(localeInfo.OFFLINESHOP_EDIT_SHOPNAME_DESCRIPTION)
self.MyShopEditNameDlg.SetAcceptEvent(self.__OnAcceptChangeShopNameDlg)
self.MyShopEditNameDlg.SetCancelEvent(self.__OnCancelChangeShopNameDlg)
self.MyShopEditNameDlg.SetTitle(localeInfo.OFFLINESHOP_EDIT_SHOPNAME_TITLE)
self.MyShopEditNameDlg.Hide()
self.__MakeShopListTable()
self.OpenShopBackToListButton = self.GetChild("OpenShopBackToListButton")
self.OpenShopShopTitle = self.GetChild("OpenShopShopTitle")
self.OpenShopShopDuration = self.GetChild("OpenShopShopDuration")
self.CommonQuestionDlg = uiCommon.QuestionDialog()
self.CommonPickValuteDlg = uiPickMoney.PickMoneyDialog()
self.CommonPickValuteDlg.LoadDialog()
self.OpenShopBackToListButton.SAFE_SetEvent(self.__OnClickShopListPage)
self.__MakeOpenShopItemsTable()
self.TitleBar = self.GetChild("TitleBar")
self.TitleBar.SetCloseEvent(self.Close)
self.MyShopButton = self.GetChild("MyShopButton")
self.MyAuctionButton = self.GetChild("MyAuctionButton")
self.ShopSafeboxButton = self.GetChild("ShopSafeboxButton")
self.SearchFilterButton = self.GetChild("SearchFilterButton")
self.MenuButton = ExpandingMenu(self, localeInfo.OFFLINE_SHOP_MENU)
self.MenuButton.SetPosition(426, 32)
self.MenuButton.AddMenuOption(localeInfo.OFFLINESHOP_TITLE_LIST_OF_SHOPS , self.__OnClickShopListPage)
self.MenuButton.AddMenuOption(localeInfo.OFFLINESHOP_TITLE_MY_OFFERS, self.__OnClickMyOffersPage)
self.MenuButton.AddMenuOption(localeInfo.OFFLINESHOP_TITLE_SEARCH_HISTORY, self.__OnClickSearchHistoryPage)
self.MenuButton.AddMenuOption(localeInfo.OFFLINESHOP_TITLE_MY_PATTERNS, self.__OnClickMyPatternsPage)
self.MenuButton.AddMenuOption(localeInfo.OFFLINESHOP_TITLE_AUCTION_LIST, self.__OnClickAuctionListPage)
#events setting
self.MyShopButton.SAFE_SetEvent(self.__OnClickMyShopPage)
self.ShopSafeboxButton.SAFE_SetEvent(self.__OnClickShopSafeboxPage)
self.SearchFilterButton.SAFE_SetEvent(self.__OnClickSearchFilterPage)
self.MyAuctionButton.SAFE_SetEvent(self.__OnClickMyAuctionPage)
self.updateEvents = {
"my_shop" : self.__OnUpdateMyShopPage,
"create_shop" : self.__OnUpdateCreateShopPage,
"open_shop" : self.__OnUpdateOpenShopPage,
"search_filter" : self.__OnUpdateSearchFilterPage,
"shop_safebox" : self.__OnUpdateShopSafeboxPage,
"my_offers" : self.__OnUpdateMyOffersPage,
"search_history": self.__OnUpdateSearchHistoryPage,
"my_patterns" : self.__OnUpdateMyPatternPage,
"create_auction": self.__OnUpdateCreateAuctionPage,
"my_auction" : self.__OnUpdateMyAuctionPage,
"open_auction" : self.__OnUpdateOpenAuctionPage,
"auction_list" : self.__OnUpdateAuctionListPage,
}
tooltip = uiToolTip.ItemToolTip(width=300)
tooltip.ClearToolTip()
tooltip.SetFollow(True)
tooltip.Hide()
self.itemTooltip = tooltip
popup = uiCommon.PopupDialog()
popup.SetWidth(250)
popup.Hide()
self.popupMessage = popup
self.CommonInputPriceDlg = uiCommon.MoneyInputDialog()
self.CommonInputPriceDlg.SetAcceptEvent(self.__OnAcceptInputPrice)
self.CommonInputPriceDlg.SetCancelEvent(self.__OnCancelInputPrice)
offlineshop.RefreshItemNameMap()
self.__MakeSearchFilterResultItemsTable()
self.SearchFilterItemNameInput = self.GetChild("SearchFilterItemNameInput")
self.SearchFilterResetFilterButton = self.GetChild("SearchFilterResetFilterButton")
self.SearchFilterSavePatternButton = self.GetChild("SearchFilterSavePatternButton")
self.SearchFilterStartSearch = self.GetChild("SearchFilterStartSearch")
self.__MakeSearchFilterCheckBoxes()
self.SearchFilterComboBoxSuggestion = ui.ComboBox()
self.SearchFilterComboBoxSuggestion.SetParent(self.pageBoards["search_filter"])
self.SearchFilterComboBoxSuggestion.SetPosition(15+5,51)
self.SearchFilterComboBoxSuggestion.SetSize(175,24)
self.SearchFilterComboBoxSuggestion.Show()
self.SearchFilterSuggestionObj = Suggestions()
self.SearchFilterSuggestionObj.SetComboBox(self.SearchFilterComboBoxSuggestion)
self.SearchFilterSuggestionObj.SetInputBox(self.SearchFilterItemNameInput)
self.SearchFilterSuggestionObj.SetMainDict(self.SearchFilterItemsNameDict)
self.SearchFilterResetFilterButton.SAFE_SetEvent(self.__OnClickSearchFilterResetFilterButton)
self.SearchFilterSavePatternButton.SAFE_SetEvent(self.__OnClickSearchFilterSavePatternButton)
self.SearchFilterStartSearch.SAFE_SetEvent(self.__OnClickSearchFilterStartSearch)
self.categoryButtons = []
self.selectedCategory = 0
self.selectedSubCategory = 0
self.categoryButtonCount = 0
self.CategoryContainer = self.GetChild("CategoryContainer")
self.CategoryScrollBar = self.GetChild("CategoryScrollBar")
self.CategoryScrollBar.SetScrollEvent(self.OnCategoryScroll)
for k,v in self.ITEM_TYPES.items():
btn = self.__AddCategoryButton(v["name"], k)
if self.ITEM_TYPES.has_key(k) and self.ITEM_TYPES[k].has_key('subtypes'):
for sub, name in self.ITEM_TYPES[k]['subtypes'].items():
btn.AddSubButton(name, sub)
self.RefreshButtons()
self.SearchFilterTypeComboBoxIndex = 0
self.SearchFilterSubTypeComboBoxIndex = SUBTYPE_NOSET
selector = SuggestionSelector()
selector.SetParent(self.pageBoards["search_filter"])
selector.SetSelectEvent(self.__OnSelectSearchFilterSuggestionSelector)
selector.SetAttributeDict(self.ATTRIBUTES)
selector.Hide()
self.SearchFilterSuggestionSelector = selector
self.SearchFilterAttributeSetting = [0 for x in xrange(player.ATTRIBUTE_SLOT_NORM_NUM)]
self.__MakeSearchHistoryTable()
self.__MakeSearchPatternsTable()
self.SearchPatternsInputNameDlg = uiCommon.InputDialogWithDescription()
self.SearchPatternsInputNameDlg.SetMaxLength(25)
self.SearchPatternsInputNameDlg.SetDescription(localeInfo.OFFLINESHOP_MY_PATTERN_INSERT_NAME_DESC)
self.SearchPatternsInputNameDlg.SetAcceptEvent(self.__OnAcceptMyPatternInputName)
self.SearchPatternsInputNameDlg.SetCancelEvent(self.__OnCancelMyPatternInputName)
self.SearchPatternsInputNameDlg.SetTitle(localeInfo.OFFLINESHOP_MY_PATTERN_INSERT_NAME_TITLE)
self.SearchPatternsInputNameDlg.Hide()
self.__MakeShopSafeboxItemsTable()
self.ShopSafeboxValuteText = self.GetChild("ShopSafeboxValuteText")
self.ShopSafeboxWithdrawYangButton = self.GetChild("ShopSafeboxWithdrawYangButton")
self.ShopSafeboxWithdrawYangButton.SAFE_SetEvent(self.__OnClickShopSafeboxWithdrawYang)
self.__MakeMyOffersTable()
self.MyAuctionOwnerName = self.GetChild("MyAuction_OwnerName")
self.MyAuctionDuration = self.GetChild("MyAuction_Duration")
self.MyAuctionBestOffer = self.GetChild("MyAuction_BestOffer")
self.MyAuctionMinRaise = self.GetChild("MyAuction_MinRaise")
self.__MakeMyAuctionOffersTable()
#open auction page
self.OpenAuctionBackToListButton = self.GetChild("OpenAuctionBackToListButton")
self.OpenAuctionOwnerName = self.GetChild("OpenAuction_OwnerName")
self.OpenAuctionDuration = self.GetChild("OpenAuction_Duration")
self.OpenAuctionBestOffer = self.GetChild("OpenAuction_BestOffer")
self.OpenAuctionMinRaise = self.GetChild("OpenAuction_MinRaise")
self.OpenAuctionBackToListButton.SAFE_SetEvent(self.__OnClickAuctionListPage)
self.__MakeOpenAuctionOffersTable()
self.__MakeAuctionListTable()
self.CreateAuctionCreateAuctionButton = self.GetChild("CreateAuctionCreateAuctionButton")
self.CreateAuctionDaysInput = self.GetChild("CreateAuctionDaysInput")
self.CreateAuctionStartingPriceInput = self.GetChild("CreateAuctionStartingPriceInput")
self.CreateAuctionWindowPos =-1
self.CreateAuctionSlotPos=-1
self.CreateAuctionDaysDecreaseButton = self.GetChild("CreateAuctionIncreaseDaysButton")
self.CreateAuctionDaysIncreaseButton = self.GetChild("CreateAuctionDecreaseDaysButton")
self.CreateAuctionCreateAuctionButton.SAFE_SetEvent(self.__OnClickCreateAuctionButton)
self.CreateAuctionDaysDecreaseButton.SAFE_SetEvent(self.__OnClickCreateAuctionDaysDecreaseButton)
self.CreateAuctionDaysIncreaseButton.SAFE_SetEvent(self.__OnClickCreateAuctionDaysIncreaseButton)
self.__MakeCreateAuctionSlot()
if app.ENABLE_WINDOW_SLIDE_EFFECT:
self.EnableSlidingEffect()
items = (
self.CreateShopNameEdit,
self.SearchFilterItemNameInput,
self.CreateAuctionStartingPriceInput,
)
autokill = lambda arg: arg.KillFocus()
for item in items:
item.OnPressEscapeKey = autokill
def Open(self):
events = {
"my_shop" : self.__OnClickMyShopPage,
"open_shop" : self.__OnClickShopListPage,
"shop_list" : self.__OnClickShopListPage,
"shop_safebox" : self.__OnClickShopSafeboxPage,
"my_offers" : self.__OnClickMyOffersPage,
"search_history" : self.__OnClickSearchHistoryPage,
"my_patterns" : self.__OnClickMyPatternsPage,
"search_filter" : self.__OnClickSearchFilterPage,
"my_auction" : self.__OnClickMyAuctionPage,
"auction_list" : self.__OnClickAuctionListPage,
"open_auction" : self.__OnClickAuctionListPage,
}
if self.pageCategory in events.keys():
events[self.pageCategory]()
self.Show()
def OpenSearch(self):
offlineshop.SendCloseBoard()
self.pageCategory = "search_filter"
for page in self.pageBoards.values():
page.Hide()
self.pageBoards["search_filter"].Show()
self.Show()
def Close(self):
self.Hide()
self.itemTooltip.Hide()
self.MyShopEditNameDlg.Hide()
self.CommonQuestionDlg.Hide()
self.CommonPickValuteDlg.Hide()
self.CommonInputPriceDlg.Hide()
offlineshop.SendCloseBoard()
def __ResetCreateShopPage(self):
self.CreateShopItemsTable.ClearElement()
self.CreateShopItemsInfos = {}
def __MakeCreateShopItemsTable(self):
board = self.pageBoards["create_shop"]
table = TableWindowWithScrollbar(575, 325, 11,3, TableWindowWithScrollbar.SCROLLBAR_HORIZONTAL)
table.SetParent(board)
table.SetPosition(24, 95)
table.SetDefaultCreateChild(MakeDefaultEmptySlot, self.__OnClickCreateShopEmptySlot)
table.Show()
self.CreateShopItemsTable = table
def __MakeMyShopItemsTable(self):
board = self.pageBoards["my_shop"]
table = TableWindowWithScrollbar(575, 315, 11,3, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
table.SetParent(board)
table.SetPosition(24, 35)
table.SetDefaultCreateChild(MakeDefaultEmptySlot, self.__OnClickMyShopEmptySlot)
table.Show()
self.MyShopItemsTable = table
def __MakeMyShopOffersTable(self):
board = self.pageBoards["my_shop"]
table = TableWindowWithScrollbar(585, 90-5, 1,6 , TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
table.SetParent(board)
table.SetPosition(16, 408)
table.Show()
self.MyShopOffersTable = table
def __MakeShopListTable(self):
board = self.pageBoards["shop_list"]
table = TableWindowWithScrollbar(590, 500-15, 1, 20, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
table.SetParent(board)
table.SetPosition(10, 19)
table.Show()
self.ShopListTable = table
def __MakeOpenShopItemsTable(self):
board = self.pageBoards["open_shop"]
table = TableWindowWithScrollbar(584, 440, 11,4, TableWindowWithScrollbar.SCROLLBAR_HORIZONTAL)
table.SetParent(board)
table.SetPosition(20,55)
table.SetDefaultCreateChild(MakeDefaultEmptySlot)
table.Show()
self.OpenShopItemsTable = table
def __MakeOpenAuctionOffersTable(self):
board = self.pageBoards["open_auction"]
table = TableWindowWithScrollbar(590, 290, 1, 12, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
table.SetParent(board)
table.SetPosition(10, 165)
table.Show()
self.OpenAuctionOfferTable = table
def __MakeMyAuctionOffersTable(self):
board = self.pageBoards["my_auction"]
table = TableWindowWithScrollbar(590, 290, 1, 12, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
table.SetParent(board)
table.SetPosition(10, 165)
table.Show()
self.MyAuctionOfferTable = table
def __MakeAuctionListTable(self):
board = self.pageBoards["auction_list"]
table = TableWindowWithScrollbar(590, 500-15, 1, 20, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
table.SetParent(board)
table.SetPosition(10, 19)
table.Show()
self.AuctionListTable = table
def SetCategory(self, category, subcategory):
self.SearchFilterTypeComboBoxIndex = category
self.SearchFilterSubTypeComboBoxIndex = subcategory
for i in range(len(self.categoryButtons)):
self.categoryButtons.UpdateSubButtons(category, subcategory)
def RefreshButtons(self):
self.__RefreshCategoryButtons(False)
def __AddCategoryButton(self, name, category_id):
button = CategoryButton(self.CategoryContainer, self, name, category_id)
button.SetPosition(0, len(self.categoryButtons) * 28)
self.categoryButtons.append(button)
return button
def __RefreshCategoryButtons(self, isScroll):
self.categoryButtonCount = 0
for i in range(len(self.categoryButtons)):
self.categoryButtonCount += 1
if self.categoryButtons.active:
self.categoryButtonCount += len(self.categoryButtons.subButtons)
pos = int(self.CategoryScrollBar.GetPos() * (self.categoryButtonCount - NewOfflineShopBoard.MAX_CATEGORY_ITEMS))
top = 0
count = 0
for i in range(len(self.categoryButtons)):
if count < pos or count >= (pos + NewOfflineShopBoard.MAX_CATEGORY_ITEMS):
self.categoryButtons.SetPositionHelper(0, top - (pos - count) * 28)
self.categoryButtons.Hide()
else:
self.categoryButtons.SetPositionHelper(0, top)
self.categoryButtons.Show()
top += 28
if self.categoryButtons.active:
for sub in range(len(self.categoryButtons.subButtons)):
count += 1
if count < pos or count >= (pos + NewOfflineShopBoard.MAX_CATEGORY_ITEMS):
self.categoryButtons[i].subButtons[0].Hide()
else:
self.categoryButtons[i].subButtons[0].Show()
top += 28
count += 1
if not isScroll:
self.CategoryScrollBar.SetMiddleBarSize(float(NewOfflineShopBoard.MAX_CATEGORY_ITEMS) / float(self.categoryButtonCount))
if self.categoryButtonCount > 13:
self.CategoryScrollBar.Show()
else:
self.CategoryScrollBar.Hide()
def OnCategoryScroll(self):
self.__RefreshCategoryButtons(True)
def __MakeSearchFilterCheckBoxes(self):
positions = {
"name" : { "x" : 6+98-5, "y" : 6, },
"wear" : { "x" : 6+98-5, "y" : 78, },
"type" : { "x" : 6+98-5, "y" : 120, },
}
race = {
"warrior" : { "x" : 180-6, "y" : 95, },
"assassin" : { "x" : 140-6, "y" : 95, },
"sura" : { "x" : 100-5, "y" : 95, },
"shaman" : { "x" : 60-4, "y" : 95, },
"wolfman" : { "x" : 20, "y" : 95, },
}
for k, v in positions.items():
checkbox = ui.CustomCheckBox({'base' : "d:/ymir work/ui/checkbox/checkbox_new_unselected.tga", 'tip' : "d:/ymir work/ui/checkbox/checkbox_new_selected.tga",})
checkbox.SetParent(self.pageBoards["search_filter"])
checkbox.SetPosition(v["x"] , v["y"])
checkbox.Show()
self.SearchFilterCheckBoxes[k] = checkbox
for k, v in race.items():
checkbox = ui.CustomCheckBox({'base' : "offlineshop/checkbox/%s_base.png"%k , 'tip' : "offlineshop/checkbox/%s_tip.png"%k,})
checkbox.SetParent(self.pageBoards["search_filter"])
checkbox.SetPosition(v["x"] , v["y"])
checkbox.Show()
checkbox.Enable()
self.SearchFilterCheckBoxesRace[k] = checkbox
def __MakeSearchFilterResultItemsTable(self):
board = self.pageBoards["search_filter"]
ItemContainerListBox = NewListBox()
ItemContainerListBox.SetParent(board)
ItemContainerListBox.SetSize(375, 460)
ItemContainerListBox.SetPosition(204, 2)
ItemContainerListBox.Show()
ItemContainerListBox.ClearItems()
self.MainScrollBar = self.GetChild("ContainerScrollBar")
self.SearchFilterResultItemsTable = ItemContainerListBox
self.SearchFilterResultItemsTable.SetScrollBar(self.MainScrollBar)
def __MakeSearchHistoryTable(self):
board = self.pageBoards["search_history"]
table = TableWindowWithScrollbar(590, 500-15, 1, 20 , TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
table.SetParent(board)
table.SetPosition(10, 19)
table.Show()
self.SearchHistoryTable = table
def __MakeSearchPatternsTable(self):
board = self.pageBoards["my_patterns"]
table = TableWindowWithScrollbar(590, 500-15, 1, 20, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
table.SetParent(board)
table.SetPosition(10, 19)
table.Show()
self.SearchPatternsTable = table
def __MakeShopSafeboxItemsTable(self):
board = self.pageBoards["shop_safebox"]
table = TableWindowWithScrollbar(582, 443, 11, 4, TableWindowWithScrollbar.SCROLLBAR_HORIZONTAL)
table.SetParent(board)
table.SetPosition(18, 50)
table.SetDefaultCreateChild(MakeDefaultEmptySlot)
table.Show()
self.ShopSafeboxItemsTable = table
def __MakeMyOffersTable(self):
board = self.pageBoards["my_offers"]
table = TableWindowWithScrollbar(570, 445, 2, 3, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
table.SetParent(board)
table.SetPosition(30, 25)
table.Show()
self.MyOffersTable = table
def __MakeCreateAuctionSlot(self):
if self.CreateAuctionSlot:
del self.CreateAuctionSlot
slot = Slot()
slot.Show()
slot.SetParent(self.pageBoards['create_auction'])
slot.SetPosition(400,141)
# slot.SetInfo(info)
self.CreateAuctionSlot = slot
def __MakeMyAuctionSlot(self, info):
if self.MyAuctionSlot:
del self.MyAuctionSlot
slot = Slot()
slot.SetParent(self.pageBoards['my_auction'])
slot.SetPosition(339+65,97-73)
slot.SetInfo(info)
slot.Show()
self.MyAuctionSlot = slot
def __MakeOpenAuctionSlot(self, info):
if self.OpenAuctionSlot:
del self.OpenAuctionSlot
slot = Slot()
slot.SetParent(self.pageBoards['open_auction'])
slot.SetPosition(339+65,97-73)
slot.SetInfo(info)
slot.Show()
slot.SetOnMouseLeftButtonUpEvent(self.__OnClickOpenAuctionMakeOffer)
self.OpenAuctionSlot = slot
def __OnClickCreateShopIncreaseDaysButton(self):
days = int(self.CreateShopDaysCountText.GetText())
if days == offlineshop.OFFLINESHOP_MAX_DAYS:
self.CreateShopDaysCountText.SetText("0")
else:
self.CreateShopDaysCountText.SetText(str(days+1))
def __OnClickCreateShopDecreaseDaysButton(self):
days = int(self.CreateShopDaysCountText.GetText())
if days == 0:
self.CreateShopDaysCountText.SetText(str(offlineshop.OFFLINESHOP_MAX_DAYS))
else:
self.CreateShopDaysCountText.SetText(str(days-1))
def __OnClickCreateShopIncreaseHoursButton(self):
hours = int(self.CreateShopHoursCountText.GetText())
if hours == offlineshop.OFFLINESHOP_MAX_HOURS:
self.CreateShopHoursCountText.SetText("0")
else:
self.CreateShopHoursCountText.SetText(str(hours+1))
def __OnClickCreateShopDecreaseHoursButton(self):
hours = int(self.CreateShopHoursCountText.GetText())
if hours == 0:
self.CreateShopHoursCountText.SetText(str(offlineshop.OFFLINESHOP_MAX_HOURS))
else:
self.CreateShopHoursCountText.SetText(str(hours-1))
def __OnClickCloseButton(self):
offlineshop.SendForceCloseShop()
self.Close()
def __OnClickMyShopEditNameButton(self):
self.MyShopEditNameDlg.inputValue.SetText("")
self.MyShopEditNameDlg.Open()
def __OnClickMyShopPage(self):
offlineshop.SendCloseBoard()
offlineshop.SendOpenShopOwner()
self.EnableRefreshSymbol()
def __OnClickShopListPage(self):
offlineshop.SendCloseBoard()
offlineshop.SendRequestShopList()
self.EnableRefreshSymbol()
def __OnClickShopSafeboxPage(self):
offlineshop.SendCloseBoard()
offlineshop.SendSafeboxOpen()
self.EnableRefreshSymbol()
def __OnClickMyOffersPage(self):
offlineshop.SendCloseBoard()
offlineshop.SendOfferListRequest()
self.EnableRefreshSymbol()
def __OnClickSearchFilterPage(self):
offlineshop.SendCloseBoard()
self.pageCategory = "search_filter"
for page in self.pageBoards.values():
page.Hide()
self.pageBoards["search_filter"].Show()
def __OnSelectSearchFilterSuggestionSelector(self, index):
pass
def __OnClickSearchFilterAttributeButton(self, index):
pass
def __OnClickSearchHistoryPage(self):
offlineshop.SendCloseBoard()
self.pageCategory = "search_history"
for v in self.pageBoards.values():
v.Hide()
self.pageBoards["search_history"].Show()
self.RefreshSearchHistoryPage()
def __OnClickMyPatternsPage(self):
offlineshop.SendCloseBoard()
for v in self.pageBoards.values():
v.Hide()
self.pageBoards["my_patterns"].Show()
self.pageCategory = "my_patterns"
self.RefreshMyPatternsPage()
def __OnClickSearchPatternElement(self, element):
info = element.GetInfo()
self.__SetSearchFilterPattern(info)
offlineshop.UpdateLastUseFilterPattern(info["id"])
def __OnClickMyAuctionPage(self):
offlineshop.SendCloseBoard()
offlineshop.SendAuctionOpenMy()
self.EnableRefreshSymbol()
def __OnClickAuctionListPage(self):
offlineshop.SendCloseBoard()
offlineshop.SendAuctionListRequest()
self.EnableRefreshSymbol()
def __OnClickCreateAuctionButton(self):
if self.CreateAuctionWindowPos == -1:
return
if self.CreateAuctionSlotPos == -1:
return
daystext = self.CreateAuctionDaysInput.GetText()
days = int(daystext) if daystext and daystext.isdigit() else 0
if 0 == days or offlineshop.OFFLINESHOP_MAX_DAYS<days:
self.__PopupMessage(localeInfo.OFFLINESHOP_CREATE_SHOP_INVALID_DURATION)
return
pricetext = self.CreateAuctionStartingPriceInput.GetText()
price = long(pricetext) if pricetext and pricetext.isdigit() else 0
if price <= 0:
self.__PopupMessage(localeInfo.OFFLINESHOP_CREATE_AUCTION_INVALID_PRICE)
return
offlineshop.SendAuctionCreate(self.CreateAuctionWindowPos, self.CreateAuctionSlotPos, price, days*24*60)
self.EnableRefreshSymbol()
def __OnClickCreateAuctionDaysDecreaseButton(self):
days = int(self.CreateAuctionDaysInput.GetText())
if days ==0:
self.CreateAuctionDaysInput.SetText(str(offlineshop.OFFLINESHOP_MAX_DAYS))
else:
self.CreateAuctionDaysInput.SetText(str(days-1))
def __OnClickCreateAuctionDaysIncreaseButton(self):
days = int(self.CreateAuctionDaysInput.GetText())
if days == offlineshop.OFFLINESHOP_MAX_DAYS:
self.CreateAuctionDaysInput.SetText("0")
else:
self.CreateAuctionDaysInput.SetText(str(days + 1))
def __OnClickSearchFilterResetFilterButton(self):
for k, v in self.SearchFilterCheckBoxes.items():
v.Disable()
for v in self.SearchFilterCheckBoxesRace.values():
v.Enable()
self.SetCategory(0, SUBTYPE_NOSET)
self.SearchFilterItemNameInput.SetText("")
self.SearchFilterSuggestionObj.Clear()
# self.SearchFilterResultItemsTable.ClearElement()
self.SearchFilterResultItemsTable.ClearItems()
#offlineshop-updated 04/08/19
# self.__OnSelectSearchFilterTypeComboBox(0)
# self.__OnSelectSearchFilterSubTypeComboBox(SUBTYPE_NOSET)
def __OnClickSearchFilterSavePatternButton(self):
bActiveOne = False
for v in self.SearchFilterCheckBoxes.values():
if v.IsEnabled():
bActiveOne = True
break
if not bActiveOne:
self.__PopupMessage(localeInfo.OFFLINESHOP_NO_FILTER_ACTIVE_MESSAGE)
return
if not self.SearchPatternsInputNameDlg.IsShow():
self.SearchPatternsInputNameDlg.inputValue.SetText("")
self.SearchPatternsInputNameDlg.Open()
def OnClickSearchFilterStartSearch(self):
self.__OnClickSearchFilterStartSearch()
def __OnClickSearchFilterStartSearch(self):
bActiveOne = False
for v in self.SearchFilterCheckBoxes.values():
if v.IsEnabled():
bActiveOne = True
break
if not bActiveOne:
self.__PopupMessage(localeInfo.OFFLINESHOP_NO_FILTER_ACTIVE_MESSAGE)
return
if self.SearchFilterCheckBoxes["name"].IsEnabled():
if not self.SearchFilterItemNameInput.GetText():
self.__PopupMessage(localeInfo.OFFLINESHOP_SEARCH_FILTER_NAME_NOSET)
return
self.SearchFilterLastUsedSetting = self.GetSearchFilterSettings()
offlineshop.SendFilterRequest(*self.SearchFilterLastUsedSetting)
self.EnableRefreshSymbol()
def __OnClickFilterHistoryElement(self , element):
info = element.GetInfo()
self.__SetSearchFilterPattern(info)
def __OnClickDeleteMyOfferButton(self, id):
offer = None
for element in self.MyOffersList:
if element["offer_id"] == id:
offer = element
break
if not offer:
return
accepttext = localeInfo.OFFLINESHOP_CANCEL_OFFER_QUESTION_ACCEPT
canceltext = localeInfo.OFFLINESHOP_CANCEL_OFFER_QUESTION_CANCEL
question = localeInfo.OFFLINESHOP_CANCEL_OFFER_QUESTION
self.MyOffersCancelOfferInfo = (offer['offer_id'], offer['owner_id'])
self.__OpenQuestionDialog(len(question)*6 , accepttext, canceltext, self.__OnAcceptCancelOfferQuestion, self.__OnCancelCancelOfferQuestion, question)
def __SetSearchFilterPattern(self, info):
self.__OnClickSearchFilterPage()
for k, v in self.SearchFilterCheckBoxes.items():
v.Disable()
raceFlags = {
"warrior" :item.ITEM_ANTIFLAG_WARRIOR,
"assassin" :item.ITEM_ANTIFLAG_ASSASSIN,
"sura" :item.ITEM_ANTIFLAG_SURA,
"shaman": item.ITEM_ANTIFLAG_SHAMAN,
"wolfman": item.ITEM_ANTIFLAG_WOLFMAN,
}
flag = info["filter_wearflag"]
for k, v in raceFlags.items():
if flag & v != 0:
self.SearchFilterCheckBoxesRace[k].Disable()
if not self.SearchFilterCheckBoxes["wear"].IsEnabled():
self.SearchFilterCheckBoxes["wear"].Enable()
else:
self.SearchFilterCheckBoxesRace[k].Enable()
if info["filter_type"] == 0:
self.SetCategory(0, SUBTYPE_NOSET)
else:
if not self.SearchFilterCheckBoxes["type"].IsEnabled():
self.SearchFilterCheckBoxes["type"].Enable()
typeCategory = self.ITEM_TYPES[info["filter_type"]]
subtype = info["filter_subtype"]
if subtype != SUBTYPE_NOSET and typeCategory.has_key('subtypes'):
self.SetCategory(info["filter_type"], subtype)
else:
self.SetCategory(info["filter_type"], SUBTYPE_NOSET)
if info["filter_name"]:
self.SearchFilterCheckBoxes["name"].Enable()
self.SearchFilterItemNameInput.SetText(info["filter_name"])
def __PopupMessage(self, message):
self.popupMessage.SetText(message)
self.popupMessage.Open()
def __OpenQuestionDialog(self , width, accepttext, canceltext, acceptevent, cancelevent, text):
self.CommonQuestionDlg.SetAcceptText(accepttext)
self.CommonQuestionDlg.SetCancelText(canceltext)
self.CommonQuestionDlg.SAFE_SetAcceptEvent(acceptevent)
self.CommonQuestionDlg.SAFE_SetCancelEvent(cancelevent)
self.CommonQuestionDlg.SetText(text)
self.CommonQuestionDlg.SetWidth(width)
self.CommonQuestionDlg.Open()
def __OnPickValute(self, title, acceptEvent, maxValue, max=13):
self.CommonPickValuteDlg.SetMax(max)
self.CommonPickValuteDlg.SetTitleName(title)
self.CommonPickValuteDlg.SetAcceptEvent(acceptEvent)
self.CommonPickValuteDlg.Open(maxValue)
def OnShowPage(self):
showEvents = {
"my_shop" : self.__OnClickMyShopPage,
}
if self.pageCategory in showEvents:
showEvents[self.pageCategory]()
def BINARY_EnableRefreshSymbol(self):
if self.IsShow():
self.EnableRefreshSymbol()
def EnableRefreshSymbol(self):
self.RefreshSymbol.Show()
def DisableRefreshSymbol(self):
self.RefreshSymbol.Hide()
def ShopListClear(self):
self.ShopList = []
def ShopListAddItem( self, owner_id, duration , count , name):
newelement = {}
newelement["owner_id"] = owner_id
newelement["duration"] = duration
newelement["count"] = count
newelement["name"] = name
self.ShopList.append(newelement)
def ShopListShow(self):
self.RefreshShopListPage()
self.DisableRefreshSymbol()
def OpenShop( self, owner_id, duration, count, name):
self.ShopItemSold = []
self.ShopItemForSale = []
self.ShopOpenInfo["owner_id"] = owner_id
self.ShopOpenInfo["duration"] = duration
self.ShopOpenInfo["count"] = count
self.ShopOpenInfo["name"] = name
self.ShopOpenInfo["my_shop"] = False
def OpenShopItem_Alloc(self):
self.ShopItemForSale.append({})
def OpenShopItem_SetValue( self, key, index, *args):
if key == "id":
self.ShopItemForSale[index][key] = args[0]
elif key == "vnum" or key == 'trans':
self.ShopItemForSale[index][key] = args[0]
elif key == "count":
self.ShopItemForSale[index][key] = args[0]
elif key == "attr":
if not key in self.ShopItemForSale[index]:
self.ShopItemForSale[index][key] = {}
attr_index = args[0]
attr_type = args[1]
attr_value = args[2]
self.ShopItemForSale[index][key][attr_index] = {}
self.ShopItemForSale[index][key][attr_index]["type"] = attr_type
self.ShopItemForSale[index][key][attr_index]["value"] = attr_value
elif key == "socket":
if not key in self.ShopItemForSale[index]:
self.ShopItemForSale[index][key] = {}
socket_index = args[0]
socket_val = args[1]
self.ShopItemForSale[index][key][socket_index] = socket_val
elif key == "price":
self.ShopItemForSale[index][key] = args[0]
def OpenShop_End(self):
self.RefreshOpenShopPage()
self.DisableRefreshSymbol()
if not self.IsShow():
self.Show()
def OpenShopOwner_Start( self, owner_id, duration , count , name):
self.ShopItemSold = []
self.ShopItemForSale = []
self.MyShopOffers = []
self.ShopOpenInfo["owner_id"] = owner_id
self.ShopOpenInfo["duration"] = duration
self.ShopOpenInfo["count"] = count
self.ShopOpenInfo["name"] = name
self.ShopOpenInfo["my_shop"] = True
def OpenShopOwner_End(self):
self.DisableRefreshSymbol()
self.RefreshMyShopPage()
if not self.IsShow():
self.Show()
def OpenShopOwnerItem_Alloc(self):
self.ShopItemForSale.append({})
def OpenShopOwnerItem_SetValue( self, key, index, *args):
if key == "id":
self.ShopItemForSale[index][key] = args[0]
elif key == "vnum" or key == 'trans':
self.ShopItemForSale[index][key] = args[0]
elif key == "count":
self.ShopItemForSale[index][key] = args[0]
elif key == "attr":
if not key in self.ShopItemForSale[index]:
self.ShopItemForSale[index][key] = {}
attr_index = args[0]
attr_type = args[1]
attr_value = args[2]
self.ShopItemForSale[index][key][attr_index] = {}
self.ShopItemForSale[index][key][attr_index]["type"] = attr_type
self.ShopItemForSale[index][key][attr_index]["value"] = attr_value
elif key == "socket":
if not key in self.ShopItemForSale[index]:
self.ShopItemForSale[index][key] = {}
socket_index = args[0]
socket_val = args[1]
self.ShopItemForSale[index][key][socket_index] = socket_val
elif key == "price":
self.ShopItemForSale[index][key] = args[0]
def OpenShopOwner_SetOffer(self, itemid , buyerid, offerid, price, is_accept, buyer_name ):
newoffer = {}
newoffer["id"] = offerid
newoffer["item_id"] = itemid
newoffer["buyer_id"] = buyerid
newoffer["price"] = price
newoffer["is_accept"] = is_accept
newoffer['buyer_name'] = buyer_name
self.MyShopOffers.append(newoffer)
def OpenShopOwnerItemSold_Alloc( self ):
self.ShopItemSold.append({})
def OpenShopOwnerItemSold_SetValue( self, key , index , *args):
if key == "id":
self.ShopItemSold[index][key] = args[0]
elif key == "vnum" or key == 'trans':
self.ShopItemSold[index][key] = args[0]
elif key == "count":
self.ShopItemSold[index][key] = args[0]
elif key == "attr":
if not key in self.ShopItemSold[index]:
self.ShopItemSold[index][key] = {}
attr_index = args[0]
attr_type = args[1]
attr_value = args[2]
self.ShopItemSold[index][key][attr_index] = {}
self.ShopItemSold[index][key][attr_index]["type"] = attr_type
self.ShopItemSold[index][key][attr_index]["value"] = attr_value
elif key == "socket":
if not key in self.ShopItemSold[index]:
self.ShopItemSold[index][key] = {}
socket_index = args[0]
socket_val = args[1]
self.ShopItemSold[index][key][socket_index] = socket_val
elif key == "price":
self.ShopItemSold[index][key] = args[0]
def OpenShopOwnerItemSold_Show( self):
pass
def OpenShopOwnerNoShop(self):
for v in self.pageBoards.values():
v.Hide()
self.pageBoards["create_shop"].Show()
self.pageCategory = "create_shop"
self.DisableRefreshSymbol()
self.__ResetCreateShopPage()
def ClearItemNames(self):
self.SearchFilterItemsNameDict = {}
def AppendItemName(self, vnum, name):
self.SearchFilterItemsNameDict[name] = vnum
def ShopClose( self):
pass
def ShopFilterResult( self , size):
self.SearchFilterShopItemResult = []
def ShopFilterResultItem_Alloc(self):
self.SearchFilterShopItemResult.append({})
def ShopFilterResultItem_SetValue( self, key, index, *args):
if key in ( "id", "vnum", "count", "price", "owner", "owner_name", 'trans'):
self.SearchFilterShopItemResult[index][key] = args[0]
elif key == "attr":
if not key in self.SearchFilterShopItemResult[index]:
self.SearchFilterShopItemResult[index][key] = {}
attr_index = args[0]
attr_type = args[1]
attr_value = args[2]
self.SearchFilterShopItemResult[index][key][attr_index] = {}
self.SearchFilterShopItemResult[index][key][attr_index]["type"] = attr_type
self.SearchFilterShopItemResult[index][key][attr_index]["value"] = attr_value
elif key == "socket":
if not key in self.SearchFilterShopItemResult[index]:
self.SearchFilterShopItemResult[index][key] = {}
socket_index = args[0]
socket_val = args[1]
self.SearchFilterShopItemResult[index][key][socket_index] = socket_val
def ShopFilterResult_Show(self):
self.SearchFilterResultItemsTable.ClearItems()
for info in self.SearchFilterShopItemResult:
slot = ShopSearchItem()
slot.SetInfo(info)
slot.SetIndex((info["id"], info["owner"]))
slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickSearchFilterShopResultItem)
slot.Show()
self.SearchFilterResultItemsTable.AppendItem(slot)
if len(self.SearchFilterShopItemResult) == SEARCH_RESULT_LIMIT:
self.__PopupMessage(localeInfo.OFFLINESHOP_SEARCH_RISE_LIMIT%SEARCH_RESULT_LIMIT)
setting = self.GetSearchFilterSettings()
setting = (len(self.SearchFilterShopItemResult),) + setting
offlineshop.AppendNewFilterHistory(*setting)
self.DisableRefreshSymbol()
def OfferReceived( self, offer_id , notified, accepted, owner_id, offerer_id, item_id, yang):
pass
def OfferAccept( self, offer_id , notified, accepted, owner_id, offerer_id, item_id, yang):
pass
def ClearFilterHistory(self):
self.FilterHistory = []
def AllocFilterHistory( self):
self.FilterHistory.append({'id' : len(self.FilterHistory)})
def SetFilterHistoryValue( self, key, *args):
elm = self.FilterHistory[-1]
if key == "datetime":
elm["minute"] = args[0]
elm["hour"] = args[1]
elm["day"] = args[2]
elm["month"] = args[3]
elm["year"] = args[4]
elif key in ('count' , 'filter_type' , 'filter_subtype', 'filter_name' ,'filter_wearflag'):
elm[key] = args[0]
elif key in ('filter_price_yang_start', 'filter_price_yang_end'):
if not 'price' in elm:
elm['price'] = {}
elm['price'][key.replace('filter_price_yang_', '')] = args[0]
elif key in ('filter_level_start', 'filter_level_end'):
if not 'level' in elm:
elm['level'] = {}
elm['level'][key.replace('filter_level_', '')] = args[0]
elif key in ('filter_attr_type' , 'filter_attr_value'):
if not 'attr' in elm:
elm['attr'] = {}
elm['attr']['type'] = [0 for x in xrange(offlineshop.FILTER_ATTRIBUTE_NUM)]
elm['attr']['value'] = [0 for x in xrange(offlineshop.FILTER_ATTRIBUTE_NUM)]
elm['attr'][key.replace('filter_attr_', '')][args[0]] = args[1]
def ClearFilterPatterns( self):
self.FilterPatterns = {}
def AllocFilterPattern( self , id):
self.FilterPatterns[id] = {"id": id,}
def SetFilterPatternValue( self, key, idx, *args):
elm = self.FilterPatterns[idx]
if key == "datetime":
elm["minute"] = args[0]
elm["hour"] = args[1]
elm["day"] = args[2]
elm["month"] = args[3]
elm["year"] = args[4]
elif key in ('filter_type' , 'filter_subtype', 'filter_name' ,'filter_wearflag', 'name'):
elm[key] = args[0]
elif key in ('filter_price_yang_start', 'filter_price_yang_end'):
if not 'price' in elm:
elm['price'] = {}
elm['price'][key.replace('filter_price_yang_', '')] = args[0]
elif key in ('filter_level_start', 'filter_level_end'):
if not 'level' in elm:
elm['level'] = {}
elm['level'][key.replace('filter_level_', '')] = args[0]
elif key in ('filter_attr_type' , 'filter_attr_value'):
if not 'attr' in elm:
elm['attr'] = {}
elm['attr']['type'] = [0 for x in xrange(offlineshop.FILTER_ATTRIBUTE_NUM)]
elm['attr']['value'] = [0 for x in xrange(offlineshop.FILTER_ATTRIBUTE_NUM)]
elm['attr'][key.replace('filter_attr_', '')][args[0]] = args[1]
def GetSearchFilterSettings(self):
name = ""
raceflag = 0
type = 0
subtype = SUBTYPE_NOSET
levelmin = 0
levelmax = 0
yangmin = 0
yangmax = 0
attributes = tuple([(0,0) for x in xrange(player.ATTRIBUTE_SLOT_NORM_NUM)])
if self.SearchFilterCheckBoxes["name"].IsEnabled():
name = self.SearchFilterItemNameInput.GetText()
if self.SearchFilterCheckBoxes["type"].IsEnabled():
type = self.SearchFilterTypeComboBoxIndex
subtype = self.SearchFilterSubTypeComboBoxIndex
if self.SearchFilterCheckBoxes["wear"].IsEnabled():
raceFlagDct = {
"warrior" : item.ITEM_ANTIFLAG_WARRIOR,
"assassin" : item.ITEM_ANTIFLAG_ASSASSIN,
"sura" : item.ITEM_ANTIFLAG_SURA,
"shaman" : item.ITEM_ANTIFLAG_SHAMAN,
}
if app.ENABLE_WOLFMAN:
raceFlagDct.update({
"wolfman" : item.ITEM_ANTIFLAG_WOLFMAN,
})
for k,v in raceFlagDct.items():
if not self.SearchFilterCheckBoxesRace[k].IsEnabled():
raceflag |= v
return (type, subtype, name, (yangmin,yangmax), (levelmin, levelmax), raceflag, attributes)
def __IsSaleableSlot(self, win , pos):
if win == player.INVENTORY:
if player.IsEquipmentSlot(pos):
return False
if self.pageCategory in ("create_shop", "my_shop" ) and self.IsForSaleSlot(win, pos):
return False
if self.pageCategory == "create_auction" and self.IsForAuctionSlot(win,pos):
return False
if not win in (player.INVENTORY, player.DRAGON_SOUL_INVENTORY):
return False
itemIndex = player.GetItemIndex(win,pos)
if itemIndex == 0:
return False
item.SelectItem(itemIndex)
if item.IsAntiFlag(item.ITEM_ANTIFLAG_MYSHOP) or item.IsAntiFlag(item.ITEM_ANTIFLAG_GIVE):
return False
return True
def ShopBuilding_AddInventoryItem(self, slot):
if player.GetItemIndex(player.INVENTORY, slot) ==0:
return
if player.IsEquipmentSlot(slot):
return
if self.IsForSaleSlot(player.INVENTORY,slot):
return
self.OpenInsertPriceDialog(player.INVENTORY,slot)
def ShopBuilding_AddItem(self, win, pos):
if self.__IsSaleableSlot(win, pos):
self.OpenInsertPriceDialog(win,pos)
def AuctionBuilding_AddInventoryItem(self, slot):
if player.GetItemIndex(player.INVENTORY, slot) ==0:
return
if player.IsEquipmentSlot(slot):
return
if self.IsForAuctionSlot(player.INVENTORY, slot):
return
self.__OnSetCreateAuctionSlot(player.INVENTORY, slot)
def AuctionBuilding_AddItem(self, win, pos):
if self.__IsSaleableSlot(win, pos):
self.__OnSetCreateAuctionSlot(win, pos)
def SearchFilter_BuyFromSearch(self, ownerid, itemid):
if self.pageCategory != 'search_filter':
return
for item in self.SearchFilterShopItemResult:
if item['id'] == itemid and item['owner'] == ownerid:
self.SearchFilterShopItemResult.remove(item)
break
self.SearchFilterResultItemsTable.ClearItems()
for info in self.SearchFilterShopItemResult:
slot = Slot()
slot.SetInfo(info)
slot.SetIndex((info["id"], info["owner"]))
slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickSearchFilterShopResultItem)
slot.Show()
self.SearchFilterResultItemsTable.AppendItem(slot)
def ShopSafebox_Clear(self):
self.ShopSafeboxItems = []
self.ShopSafeboxItemsTable.ClearElement()
def ShopSafebox_SetValutes(self, yang):
self.ShopSafeboxValuteAmount = yang
self.ShopSafeboxValuteText.SetText(localeInfo.NumberToMoneyString(yang))
def ShopSafebox_AllocItem(self):
self.ShopSafeboxItems.append({})
def ShopSafebox_SetValue(self, key , *args):
elm = self.ShopSafeboxItems[-1]
if key in ("id", "vnum", "count", 'trans'):
elm[key] = args[0]
elif key == "socket":
if not key in elm:
elm[key] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]
elm[key][args[0]] = args[1]
elif key in ("attr_type", "attr_value"):
if not 'attr' in elm:
elm['attr'] = {}
if not args[0] in elm['attr']:
elm['attr'][args[0]] = {}
elm['attr'][args[0]][key.replace('attr_','')] = args[1]
def ShopSafebox_RefreshEnd(self):
for item in self.ShopSafeboxItems:
slot = Slot()
slot.SetIndex(item["id"])
slot.SetInfo(item)
slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickShopSafeboxItem)
slot.Show()
self.ShopSafeboxItemsTable.AddElement(slot)
if not self.pageBoards["shop_safebox"].IsShow():
self.pageCategory = "shop_safebox"
for page in self.pageBoards.values():
page.Hide()
self.pageBoards["shop_safebox"].Show()
self.DisableRefreshSymbol()
def OfferList_Clear(self):
self.MyOffersList = []
def OfferList_AddOffer(self , shopname, offer_id, buyer_id, owner_id, item_id, yang, is_notified, is_accept):
self.MyOffersList.append({})
elm = self.MyOffersList[-1]
if '@' in shopname:
shopname = shopname[shopname.find('@') + 1:]
elm["shop_name"] = shopname
elm["offer_id"] = offer_id
elm["buyer_id"] = buyer_id
elm["owner_id"] = owner_id
elm["item_id"] = item_id
elm["price"] = yang
elm["is_notified"] = is_notified
elm["is_accept"] = is_accept
def OfferList_ItemSetValue(self, key , *args):
offer = self.MyOffersList[-1]
if not offer.has_key('item'):
offer['item']={}
elm = offer['item']
if key in ("id", "vnum", "count", "owner", "price", 'trans'):
elm[key] = args[0]
elif key == "socket":
if not key in elm:
elm[key] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]
elm[key][args[0]] = args[1]
elif key in ("attr_type", "attr_value"):
if not 'attr' in elm:
elm['attr'] = {}
if not args[0] in elm['attr']:
elm['attr'][args[0]] = {}
elm['attr'][args[0]][key.replace('attr_','')] = args[1]
def OfferList_End(self):
self.RefreshMyOffersPage()
self.DisableRefreshSymbol()
def AuctionList_Clear(self):
self.AuctionListInfo = []
self.AuctionListTable.ClearElement()
def AuctionList_Alloc(self):
self.AuctionListInfo.append({"item":{},})
def AuctionList_SetInto(self, ownerid, owner_name, duration, init_yang, best_yang, offer_count):
elm = self.AuctionListInfo[-1]
info = {
"owner_id" : ownerid,
"owner_name" : owner_name,
"duration" : duration,
"init_yang" : init_yang,
"best_yang" : best_yang,
"offer_count" : offer_count,
}
for k,v in info.items():
elm[k] = v
def AuctionList_SetItemInfo(self, vnum, count, *args):
elm = self.AuctionListInfo[-1]['item']
elm['count'] = count
elm['vnum'] = vnum
try:
if app.ENABLE_CHANGELOOK_SYSTEM and len(args) !=0 :
elm['trans'] = args[0]
except:
pass
def AuctionList_SetItemSocket(self, index, value):
elm = self.AuctionListInfo[-1]['item']
if not 'socket' in elm:
elm['socket'] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]
elm['socket'][index] = value
def AuctionList_SetItemAttribute(self, key, index, value):
elm = self.AuctionListInfo[-1]['item']
if not 'attr' in elm:
elm['attr'] = [{'type' :0, 'value': 0,} for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
elm['attr'][index][key] = value
def AuctionList_End(self):
self.RefreshAuctionListPage()
self.DisableRefreshSymbol()
def MyAuction_Clear(self):
self.MyAuctionInfo = {'item':{},}
def MyAuction_SetInto(self, owner_id, owner_name, duration, init_yang):
info = {
"owner_id" : owner_id,
"owner_name" : owner_name,
"duration" : duration,
"init_yang" : init_yang,
}
for k ,v in info.items():
self.MyAuctionInfo[k] = v
def MyAuction_SetItemInfo(self, vnum, count, *args):
elm = self.MyAuctionInfo['item']
elm['vnum'] = vnum
elm['count'] = count
try:
if app.ENABLE_CHANGELOOK_SYSTEM and len(args)>0:
elm['trans'] = args[0]
except:
pass
def MyAuction_SetItemSocket(self, index , value):
elm = self.MyAuctionInfo['item']
if not 'socket' in elm:
elm['socket'] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]
elm['socket'][index] = value
def MyAuction_SetItemAttribute(self, key , index , value):
elm = self.MyAuctionInfo['item']
if not 'attr' in elm:
elm['attr'] = [{'type' :0, 'value': 0,} for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
elm['attr'][index][key] = value
def MyAuction_AddOffer(self, buyer_id, buyer_name, owner_id, price_yang):
if not 'offers' in self.MyAuctionInfo:
self.MyAuctionInfo['offers'] = []
new = {}
new['buyer_name'] = buyer_name
new['price_yang'] = price_yang
self.MyAuctionInfo['offers'].append(new)
def MyAuction_End(self):
self.RefreshMyAuctionPage()
self.DisableRefreshSymbol()
def OpenAuction_Clear(self):
self.OpenAuctionInfo = {'item':{},}
def OpenAuction_SetInto(self, owner_id, owner_name, duration, init_yang):
info = {
"owner_id" : owner_id,
"owner_name" : owner_name,
"duration" : duration,
"init_yang" : init_yang,
}
for k ,v in info.items():
self.OpenAuctionInfo[k] = v
def OpenAuction_SetItemInfo(self, vnum, count, *args):
elm = self.OpenAuctionInfo['item']
elm['vnum'] = vnum
elm['count'] = count
try:
if app.ENABLE_CHANGELOOK_SYSTEM and len(args!=0):
elm['trans'] = args[0]
except:
pass
def OpenAuction_SetItemSocket(self, index , value):
elm = self.OpenAuctionInfo['item']
if not 'socket' in elm:
elm['socket'] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]
elm['socket'][index] = value
def OpenAuction_SetItemAttribute(self, key , index , value):
elm = self.OpenAuctionInfo['item']
if not 'attr' in elm:
elm['attr'] = [{'type' :0, 'value': 0,} for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
elm['attr'][index][key] = value
def OpenAuction_AddOffer(self, buyer_id, buyer_name, owner_id, price_yang):
if not 'offers' in self.OpenAuctionInfo:
self.OpenAuctionInfo['offers'] = []
new = {}
new['buyer_name'] = buyer_name
new['price_yang'] = price_yang
self.OpenAuctionInfo['offers'].append(new)
def OpenAuction_End(self):
self.RefreshOpenAuctionPage()
self.DisableRefreshSymbol()
def MyAuction_NoAuction(self):
self.pageCategory = "create_auction"
for page in self.pageBoards.values():
page.Hide()
self.pageBoards['create_auction'].Show()
self.DisableRefreshSymbol()
def OpenInsertPriceDialog(self, win, slot):
self.AddItemSlotIndex = (win,slot)
self.CommonInputPriceDlg.Open()
vnum = player.GetItemIndex(win, slot)
count = player.GetItemCount(win, slot)
price = self.LoadInputPrice(vnum, count)
if price > 0:
self.CommonInputPriceDlg.SetValue(price)
def __OnAcceptMyShopAcceptOffer(self):
offlineshop.SendOfferAccept(self.MyShopAcceptOfferID)
self.CommonQuestionDlg.Hide()
self.MyShopAcceptOfferID = -1
def __OnCancelMyShopAcceptOffer(self):
self.CommonQuestionDlg.Hide()
self.MyShopAcceptOfferID = -1
def __OnAcceptMyShopCancelOffer(self):
offlineshop.SendOfferCancel(self.MyShopCancelOfferID, self.ShopOpenInfo['owner_id'])
self.CommonQuestionDlg.Hide()
self.MyShopCancelOfferID = -1
def __OnCancelMyShopCancelOffer(self):
self.CommonQuestionDlg.Hide()
self.MyShopCancelOfferID = -1
def __OnCancelCancelOfferQuestion(self):
self.CommonQuestionDlg.Hide()
self.MyOffersCancelOfferInfo = []
def __OnAcceptCancelOfferQuestion(self):
info = self.MyOffersCancelOfferInfo
offlineshop.SendOfferCancel(info[0], info[1])
self.CommonQuestionDlg.Hide()
self.MyOffersCancelOfferInfo = []
def SaveInputPrice(self, vnum, count, price):
import os
path = "lib/encodings/offlineshop/price"
if not os.path.exists(path):
os.makedirs(path)
n = path + "/" + str(vnum) + "_" + str(count) + ".txt"
f = file(n, "w+")
f.write(str(price))
f.close()
def LoadInputPrice(self, vnum, count):
import os
path = "lib/encodings/offlineshop/price"
if not os.path.exists(path):
os.makedirs(path)
oldPrice = 0
n = path + "/" + str(vnum) + "_" + str(count) + ".txt"
if os.path.exists(n):
fd = open( n,'r')
oldPrice = int(fd.readlines()[0])
return oldPrice
def __OnAcceptInputPrice(self):
yang = self.CommonInputPriceDlg.GetText()
if not yang.isdigit():
return
yang = int(yang)
if yang == 0:
return
if self.pageCategory == "create_shop" and self.AddItemSlotIndex != -1:
slot = Slot()
slot.SetIndex(self.AddItemSlotIndex)
slot.SetInfo(MakeSlotInfo(self.AddItemSlotIndex[0] , self.AddItemSlotIndex[1], yang))
slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickInsertedItem)
slot.Show()
self.CreateShopItemsTable.AddElement(slot)
self.CreateShopItemsInfos[slot.GetIndex()] = slot.GetInfo()
vnum = player.GetItemIndex(self.AddItemSlotIndex[0], self.AddItemSlotIndex[1])
count = player.GetItemCount(self.AddItemSlotIndex[0], self.AddItemSlotIndex[1])
self.SaveInputPrice(vnum, count, yang)
self.CommonInputPriceDlg.Hide()
self.AddItemSlotIndex = -1
elif self.pageCategory == "create_shop" and self.EditPriceSlot != None:
slot = self.EditPriceSlot
index = slot.GetIndex()
info = slot.GetInfo()
info["price"] = yang
self.CreateShopItemsInfos[slot.GetIndex()] = info
self.EditPriceSlot = None
self.CommonInputPriceDlg.Hide()
elif self.pageCategory == "my_shop" and self.AddItemSlotIndex != -1:
offlineshop.SendAddItem(self.AddItemSlotIndex[0], self.AddItemSlotIndex[1], yang)
vnum = player.GetItemIndex(self.AddItemSlotIndex[0], self.AddItemSlotIndex[1])
count = player.GetItemCount(self.AddItemSlotIndex[0], self.AddItemSlotIndex[1])
self.SaveInputPrice(vnum, count, yang)
self.AddItemSlotIndex = -1
self.CommonInputPriceDlg.Hide()
elif self.pageCategory == "my_shop" and self.EditPriceSlot != None:
slot = self.EditPriceSlot
index = slot.GetIndex()
offlineshop.SendEditItem(index, yang)
attachedSlotType = mouseModule.mouseController.GetAttachedType()
attachedSlotPos = mouseModule.mouseController.GetAttachedSlotNumber()
vnum = player.GetItemIndex(attachedSlotType, attachedSlotPos)
count = player.GetItemCount(attachedSlotType, attachedSlotPos)
self.SaveInputPrice(vnum, count, yang)
self.CommonInputPriceDlg.Hide()
self.EditPriceSlot = None
def __OnCancelInputPrice(self):
self.CommonInputPriceDlg.Hide()
self.AddItemSlotIndex = -1
self.EditPriceSlot = None
def __OnAcceptOpenShopBuyItemQuestion(self):
self.CommonQuestionDlg.Hide()
offlineshop.SendBuyItem(self.ShopOpenInfo["owner_id"] , self.OpenShopBuyItemID)
self.OpenShopBuyItemID = -1
def __OnCancelOpenShopBuyItemQuestion(self):
self.CommonQuestionDlg.Hide()
self.OpenShopBuyItemID = -1
def __OnAcceptSearchFilterBuyItemQuestion(self):
id,owner = self.SearchFilterResultClickedInfo
offlineshop.SendBuyItem(owner, id)
self.CommonQuestionDlg.Hide()
self.SearchFilterResultClickedInfo = []
def __OnCancelSearchFilterBuyItemQuestion(self):
self.CommonQuestionDlg.Hide()
self.SearchFilterResultClickedInfo = []
def __OnAcceptChangeShopNameDlg(self):
newname = self.MyShopEditNameDlg.GetText()
self.MyShopEditNameDlg.Hide()
offlineshop.SendChangeName(newname)
def __OnCancelChangeShopNameDlg(self):
self.MyShopEditNameDlg.Hide()
def __OnAcceptMyPatternInputName(self):
name = self.SearchPatternsInputNameDlg.GetText()
self.SearchPatternsInputNameDlg.Hide()
if name:
setting = self.GetSearchFilterSettings()
setting = (name,) + setting
offlineshop.AppendNewFilterPattern(*setting)
self.__PopupMessage(localeInfo.OFFLINESHOP_PATTERN_SAVED_SUCCESS)
def __OnCancelMyPatternInputName(self):
self.SearchPatternsInputNameDlg.Hide()
def __OnAcceptShopSafeboxGetItemQuestion(self):
self.CommonQuestionDlg.Hide()
offlineshop.SendSafeboxGetItem(self.ShopSafeboxGetItemIndex)
self.ShopSafeboxGetItemIndex = -1
def __OnCancelShopSafeboxGetItemQuestion(self):
self.CommonQuestionDlg.Hide()
self.ShopSafeboxGetItemIndex = -1
def __OnAcceptShopSafeboxGetValuteInput(self , yang):
offlineshop.SendSafeboxGetValutes(yang)
def __OnAcceptMakeOffer(self, yang):
offlineshop.SendOfferCreate(self.MakeOfferOwnerID, self.MakeOfferItemID, yang)
self.MakeOfferOwnerID = -1
self.MakeOfferItemID = -1
def __OnClickCreateShopButton(self):
shopname = self.CreateShopNameEdit.GetText()
if not shopname:
self.__PopupMessage(localeInfo.OFFLINESHOP_CREATE_SHOP_NO_NAME_INSERTED)
return
days = int(self.CreateShopDaysCountText.GetText())
hours = int(self.CreateShopHoursCountText.GetText())
totaltime = days * 24 * 60
totaltime += hours * 60
if totaltime > offlineshop.OFFLINESHOP_MAX_MINUTES or totaltime <= 0:
self.__PopupMessage(localeInfo.OFFLINESHOP_CREATE_SHOP_INVALID_DURATION)
return
elements = self.CreateShopItemsTable.GetElementDict()
if not elements:
self.__PopupMessage(localeInfo.OFFLINESHOP_CREATE_SHOP_NO_ITEMS_INSERTED)
return
itemLst = []
for dct in elements.values():
for item in dct.values():
info = item.GetInfo()
tupleinfo = (info["window"], info["slot"] , info["price"] )
itemLst.append(tupleinfo)
itemTuple = tuple(itemLst)
offlineshop.SendShopCreate(shopname, totaltime, itemTuple)
self.EnableRefreshSymbol()
def __OnLeftClickInsertedItem(self, slot):
if mouseModule.mouseController.isAttached():
if self.pageCategory == "create_shop":
self.__OnClickCreateShopEmptySlot()
elif self.pageCategory == "my_shop":
self.__OnClickMyShopEmptySlot()
return
if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
self.__OnRemoveShopItem(slot)
else:
self.EditPriceSlot = slot
self.CommonInputPriceDlg.Open()
def __OnLeftClickShopItem(self, slot):
if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
itemid = slot.GetIndex()
ownerid = self.ShopOpenInfo["owner_id"]
self.__OnMakeShopItemOffer(itemid, ownerid)
else:
self.OpenShopBuyItemID = slot.GetIndex()
info = slot.GetInfo()
item.SelectItem(info["vnum"])
name = item.GetItemName()
count = info["count"]
yang = info["price"]
if count > 1:
text = localeInfo.OFFLINESHOP_BUY_ITEM_QUESTION_COUNT % (name, count, yang)
else:
text = localeInfo.OFFLINESHOP_BUY_ITEM_QUESTION % (name, yang)
width = 6 * len(text)
accept_text = localeInfo.OFFLINESHOP_BUY_ITEM_QUESTION_ACCEPT
cancel_text = localeInfo.OFFLINESHOP_BUY_ITEM_QUESTION_CANCEL
accept_event= self.__OnAcceptOpenShopBuyItemQuestion
cancel_event= self.__OnCancelOpenShopBuyItemQuestion
self.__OpenQuestionDialog(width, accept_text, cancel_text, accept_event, cancel_event, text)
def __OnLeftClickSearchFilterShopResultItem(self, slot):
self.SearchFilterResultClickedInfo = slot.GetIndex()
info = slot.GetInfo()
item.SelectItem(info["vnum"])
name = item.GetItemName()
count = info["count"]
yang = info["price"]
if count > 1:
text = localeInfo.OFFLINESHOP_BUY_ITEM_QUESTION_COUNT % (name, count, yang)
else:
text = localeInfo.OFFLINESHOP_BUY_ITEM_QUESTION % (name, yang)
width = 6 * len(text)
accept_text = localeInfo.OFFLINESHOP_BUY_ITEM_QUESTION_ACCEPT
cancel_text = localeInfo.OFFLINESHOP_BUY_ITEM_QUESTION_CANCEL
accept_event = self.__OnAcceptSearchFilterBuyItemQuestion
cancel_event = self.__OnCancelSearchFilterBuyItemQuestion
self.__OpenQuestionDialog(width, accept_text, cancel_text, accept_event, cancel_event, text)
def __OnClickCreateShopEmptySlot(self, *args):
if not mouseModule.mouseController.isAttached():
return
type = mouseModule.mouseController.GetAttachedType()
slot = mouseModule.mouseController.GetAttachedSlotNumber()
#tofix slot type to window type
type = player.SlotTypeToInvenType(type)
mouseModule.mouseController.DeattachObject()
self.ShopBuilding_AddItem(type,slot)
def __OnClickMyShopEmptySlot(self, *args):
# todebug
print("my shop shop empty slot")
if not mouseModule.mouseController.isAttached():
return
type = mouseModule.mouseController.GetAttachedType()
slot = mouseModule.mouseController.GetAttachedSlotNumber()
#tofix slot type to window type
type = player.SlotTypeToInvenType(type)
mouseModule.mouseController.DeattachObject()
self.ShopBuilding_AddItem(type,slot)
def __OnClickShopListOpenShop(self, id):
offlineshop.SendOpenShop(id)
def __OnClickOpenAuctionMakeOffer(self, slot):
self.__OnPickValute(localeInfo.OFFLINESHOP_AUCTION_MAKE_OFFER, self.__OnClickAcceptOpenAuctionPickValute, player.GetMoney())
def __OnClickAcceptOpenAuctionPickValute(self, yang):
if not self.OpenAuctionInfo.has_key('min_raise'):
return
if yang < self.OpenAuctionInfo['min_raise']:
self.__PopupMessage(localeInfo.OFFLINESHOP_AUCTION_MIN_RAISE%NumberToString(self.OpenAuctionInfo['min_raise']) )
return
offlineshop.SendAuctionAddOffer(self.OpenAuctionInfo['owner_id'] , yang)
def __OnClickShopSafeboxWithdrawYang(self):
maxval = self.ShopSafeboxValuteAmount
self.__OnPickValute(localeInfo.OFFLINESHOP_SAFEBOX_GET_VALUTE_TITLE, self.__OnAcceptShopSafeboxGetValuteInput, maxval)
def __OnClickMyShopOfferAcceptButton(self, offer):
self.MyShopAcceptOfferID = offer.GetInfo()['id']
question = localeInfo.OFFLINESHOP_ACCEPT_OFFER_QUESTION
accepttext = localeInfo.OFFLINESHOP_ACCEPT_OFFER_QUESTION_ACCEPT
canceltext = localeInfo.OFFLINESHOP_ACCEPT_OFFER_QUESTION_CANCEL
self.__OpenQuestionDialog(len(question)*6 , accepttext, canceltext, self.__OnAcceptMyShopAcceptOffer, self.__OnCancelMyShopAcceptOffer, question)
def __OnClickMyShopOfferCancelButton(self, offer):
self.MyShopCancelOfferID = offer.GetInfo()['id']
question = localeInfo.OFFLINESHOP_CANCEL_OFFER_QUESTION
accepttext = localeInfo.OFFLINESHOP_CANCEL_OFFER_QUESTION_ACCEPT
canceltext = localeInfo.OFFLINESHOP_CANCEL_OFFER_QUESTION_CANCEL
self.__OpenQuestionDialog(len(question) * 6, accepttext, canceltext, self.__OnAcceptMyShopCancelOffer, self.__OnCancelMyShopCancelOffer, question)
def __OnClickOpenAuctionButton(self, idx):
offlineshop.SendAuctionOpenAuction(idx)
self.EnableRefreshSymbol()
def __OnLeftClickShopSafeboxItem(self, slot):
id = slot.GetIndex()
self.ShopSafeboxGetItemIndex = id
self.__OnAcceptShopSafeboxGetItemQuestion()
def __OnRemoveShopItem(self, slot):
if self.pageCategory == "create_shop":
self.__OnRemoveShopItemCreateShopPage(slot)
elif self.pageCategory == "my_shop":
self.__OnRemoveShopItemMyShop(slot)
def __OnRemoveShopItemCreateShopPage(self, slot):
slot.Hide()
del self.CreateShopItemsInfos[slot.GetIndex()]
self.CreateShopItemsTable.ClearElement()
for k, v in self.CreateShopItemsInfos.items():
newslot = Slot()
newslot.SetIndex(k)
newslot.SetInfo(v)
newslot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickInsertedItem)
newslot.Show()
self.CreateShopItemsTable.AddElement(newslot)
def __OnRemoveShopItemMyShop(self, slot):
offlineshop.SendRemoveItem(slot.GetIndex())
def __OnMakeShopItemOffer(self , itemid , ownerid):
self.MakeOfferItemID = itemid
self.MakeOfferOwnerID= ownerid
title = localeInfo.OFFLINESHOP_MAKE_OFFER_TITLE
self.__OnPickValute(title, self.__OnAcceptMakeOffer, player.GetMoney())
def __OnSetCreateAuctionSlot(self, win,slot):
vnum = player.GetItemIndex(win,slot)
if vnum ==0:
return
item.SelectItem(vnum)
if item.IsAntiFlag(item.ITEM_ANTIFLAG_MYSHOP) or item.IsAntiFlag(item.ITEM_ANTIFLAG_GIVE):
return
self.CreateAuctionWindowPos = win
self.CreateAuctionSlotPos = slot
count = player.GetItemCount(win,slot)
attrs = [{"type" : player.GetItemAttribute(win, slot, x)[0], "value" : player.GetItemAttribute(win, slot, x)[1]} for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
sockets = [player.GetItemMetinSocket(win,slot,x) for x in xrange(player.METIN_SOCKET_MAX_NUM)]
try:
if app.ENABLE_CHANGELOOK_SYSTEM:
trans = player.GetItemTransmutation(win, slot)
except:
pass
info = {
"vnum" : vnum,
"count" : count,
'attr' : attrs,
'socket' : sockets,
}
try:
if app.ENABLE_CHANGELOOK_SYSTEM:
info.update({
'trans' : trans,
})
except:
pass
self.CreateAuctionSlot.SetInfo(info)
def IsBuildingShop(self):
return self.IsShow() and (self.pageCategory == "create_shop" or self.pageCategory=="my_shop")
def IsForSaleSlot(self,win,slot):
idx = (win,slot)
if not self.pageCategory=="create_shop" or not self.IsShow():
return False
if not self.CreateShopItemsTable:
return False
elementDict = self.CreateShopItemsTable.GetElementDict()
for dct in elementDict.values():
for value in dct.values():
if value.GetIndex() == idx:
return True
return False
def IsBuildingAuction(self):
if not self.IsShow():
return False
if self.pageCategory != "create_auction":
return False
return True
def IsForAuctionSlot(self, win, slot):
if not self.IsShow():
return False
if self.pageCategory != "create_auction":
return False
return self.CreateAuctionWindowPos == win and self.CreateAuctionSlotPos == slot
def __SetTooltip(self,info):
infocolor = COLOR_TEXT_SHORTCUT
is_building = self.IsBuildingShop()
self.itemTooltip.ClearToolTip()
sockets = [info["socket"][num] for num in xrange(player.METIN_SOCKET_MAX_NUM)]
attrs = [(info["attr"][num]['type'], info["attr"][num]['value']) for num in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
self.itemTooltip.AddItemData(info["vnum"], sockets, attrs)
try:
if app.ENABLE_CHANGELOOK_SYSTEM:
trans = info.get('trans',0)
if trans !=0 and trans != -1:
self.itemTooltip.AppendTransmutation(0,0, trans)
except:
pass
if self.pageCategory in ("open_shop", "my_shop", "search_filter", "create_shop"):
self.itemTooltip.AppendPrice(info["price"])
if is_building and not info.get('sold', False):
self.itemTooltip.AppendSpace(10)
self.itemTooltip.AppendTextLine(localeInfo.OFFLINESHOP_BUILDING_LEFT_CLICK_EDIT_PRICE, infocolor)
self.itemTooltip.AppendTextLine(localeInfo.OFFLINESHOP_BUILDING_LEFT_CLICK_CTRL_REMOVE_ITEM, infocolor)
elif self.pageCategory == "open_shop":
self.itemTooltip.AppendSpace(10)
self.itemTooltip.AppendTextLine(localeInfo.OFFLINESHOP_OPEN_SHOP_LEFT_CLICK_BUY_ITEM, infocolor)
self.itemTooltip.AppendTextLine(localeInfo.OFFLINESHOP_OPEN_SHOP_LEFT_CLICK_MAKE_OFFER, infocolor)
elif self.pageCategory == "shop_safebox":
self.itemTooltip.AppendSpace(10)
self.itemTooltip.AppendTextLine(localeInfo.OFFLINESHOP_SAFEBOX_TOOLTIP_GETITEM, infocolor)
def __SetTooltipMyOffer(self, offer):
slot = offer.slot
self.__SetTooltip(slot.GetInfo())
index = offer.info['offer_id']
for elm in self.MyOffersList:
if elm['offer_id'] == index:
self.itemTooltip.AppendSpace(10)
self.itemTooltip.AppendPrice(elm['item']['price'])
self.itemTooltip.AppendTextLine(localeInfo.OFFLINESHOP_MY_OFFER_OFFER_TEXT%localeInfo.NumberToMoneyString(elm['price']))
break
def __SetTooltipSearch(self, element):
print("updating tooltip")
appendLine = lambda arg : (
uiToolTip.ToolTip.AutoAppendTextLine(self.itemTooltip, arg),
self.itemTooltip.AlignHorizonalCenter())
self.itemTooltip.ClearToolTip()
info = element.info
name = info.get('filter_name', "")
wearflag = info.get('filter_wearflag', 0)
price_min = info.get('price', {}).get('start', 0)
price_max = info.get('price', {}).get('end', 0)
level_min = info.get('level', {}).get('start',0)
level_max = info.get('level', {}).get('end',0)
type = info.get('filter_type', 0)
subtype = info.get('filter_subtype', 255)
attrs = info.get('attr')
if name:
appendLine(localeInfo.OFFLINESHOP_TOOLTIP_NAME_INFO +" "+ name)
if type:
type_phrase = localeInfo.OFFLINESHOP_TOOLTIP_TYPE_INFO+ " "
type_phrase += self.ITEM_TYPES[type]['name']
if subtype != SUBTYPE_NOSET and self.ITEM_TYPES[type].has_key('subtypes'):
type_phrase += ", "+self.ITEM_TYPES[type]['subtypes'][subtype]
appendLine(type_phrase)
if price_min or price_max:
price_phrase = localeInfo.OFFLINESHOP_TOOLTIP_PRICE_INFO + " "
if price_min and price_max:
price_phrase += NumberToString(price_min) + " - "+ localeInfo.NumberToMoneyString(price_max)
elif price_min:
price_phrase += " > "+ localeInfo.NumberToMoneyString(price_min)
elif price_max:
price_phrase += " < "+ localeInfo.NumberToMoneyString(price_max)
appendLine(price_phrase)
if level_min or level_max:
level_phrase = localeInfo.OFFLINESHOP_TOOLTIP_LEVEL_INFO + " "
if level_min and level_max:
level_phrase += "%d - %d"%(level_min, level_max)
elif level_min:
level_phrase += " >= %d"%level_min
elif level_max:
level_phrase += " <= %d"%level_max
appendLine(level_phrase)
raceFlagDct = {
item.ITEM_ANTIFLAG_WARRIOR : localeInfo.OFFLINESHOP_WEAR_WARRIOR,
item.ITEM_ANTIFLAG_ASSASSIN : localeInfo.OFFLINESHOP_WEAR_ASSASSIN,
item.ITEM_ANTIFLAG_SURA : localeInfo.OFFLINESHOP_WEAR_SURA,
item.ITEM_ANTIFLAG_SHAMAN : localeInfo.OFFLINESHOP_WEAR_SHAMAN,
}
if app.ENABLE_WOLFMAN:
raceFlagDct.update({
item.ITEM_ANTIFLAG_WOLFMAN: localeInfo.OFFLINESHOP_WEAR_WOLFMAN,
})
wearphrase = ""
for k ,v in raceFlagDct.items():
if not wearflag & k:
if wearphrase:
wearphrase += ", "
wearphrase += v
if wearphrase:
wearphrase = localeInfo.OFFLINESHOP_TOOLTIP_WEAR_INFO + wearphrase
appendLine(wearphrase)
attribute_phrase = ""
for type in attrs['type']:
if type != 0:
if attribute_phrase:
attribute_phrase += ', '
attribute_phrase += self.ATTRIBUTES[type]
if attribute_phrase:
attribute_phrase = localeInfo.OFFLINESHOP_TOOLTIP_ATTR_INFO +' '+attribute_phrase
appendLine(attribute_phrase)
self.itemTooltip.ShowToolTip()
def __SetTooltipAuctionList(self, element):
itemInfo = element.GetInfo()['item']
self.__SetTooltip(itemInfo)
def OnUpdate(self):
self.MenuButton.OnUpdate()
# try:
if self.pageCategory in self.updateEvents:
self.updateEvents[self.pageCategory]()
def __OnUpdateMyShopPage(self):
self.__RefreshingTooltip(self.MyShopItemsTable)
def __OnUpdateCreateShopPage(self):
self.__RefreshingTooltip(self.CreateShopItemsTable)
def __OnUpdateOpenShopPage(self):
self.__RefreshingTooltip(self.OpenShopItemsTable)
def __OnUpdateSearchFilterPage(self):
pass
# self.__RefreshingTooltip(self.SearchFilterResultItemsTable)
def __OnUpdateSearchHistoryPage(self):
self.__RefreshingTooltip(self.SearchHistoryTable , self.__SetTooltipSearch)
def __OnUpdateMyPatternPage(self):
self.__RefreshingTooltip(self.SearchPatternsTable, self.__SetTooltipSearch)
def __OnUpdateShopSafeboxPage(self):
self.__RefreshingTooltip(self.ShopSafeboxItemsTable)
def __OnUpdateMyOffersPage(self):
self.__RefreshingTooltip(self.MyOffersTable, self.__SetTooltipMyOffer)
def __OnUpdateCreateAuctionPage(self):
if self.CreateAuctionSlot.IsShow():
if self.itemTooltip.IsShow():
if not self.CreateAuctionSlot.IsInSlot():
self.itemTooltip.Hide()
else:
if self.CreateAuctionSlot.IsInSlot() and self.CreateAuctionSlot.GetInfo():
self.__SetTooltip(self.CreateAuctionSlot.GetInfo())
def __OnUpdateMyAuctionPage(self):
if self.MyAuctionSlot.IsShow():
if self.itemTooltip.IsShow():
if not self.MyAuctionSlot.IsInSlot():
self.itemTooltip.Hide()
else:
if self.MyAuctionSlot.IsInSlot() and self.MyAuctionSlot.GetInfo():
self.__SetTooltip(self.MyAuctionSlot.GetInfo())
def __OnUpdateOpenAuctionPage(self):
if self.OpenAuctionSlot.IsShow():
if self.itemTooltip.IsShow():
if not self.OpenAuctionSlot.IsInSlot():
self.itemTooltip.Hide()
else:
if self.OpenAuctionSlot.IsInSlot() and self.OpenAuctionSlot.GetInfo():
self.__SetTooltip(self.OpenAuctionSlot.GetInfo())
self.itemTooltip.AppendTextLine(localeInfo.OFFLINESHOP_TOOLTIP_LEFT_CLICK_MAKE_OFFER)
def __OnUpdateAuctionListPage(self):
self.__RefreshingTooltip(self.AuctionListTable, self.__SetTooltipAuctionList)
def __RefreshingTooltip(self, table, event = None):
if not self.itemTooltip.IsShow():
elementDict = table.GetElementDict()
for dct in elementDict.values():
for value in dct.values():
if value.IsInSlot():
self.slotTooltipIndex = value.GetIndex()
if event == None:
self.__SetTooltip(value.GetInfo())
else:
event(value)
return
self.itemTooltip.Hide()
self.slotTooltipIndex = -1
else:
elementDict = table.GetElementDict()
for dct in elementDict.values():
for value in dct.values():
if value.IsInSlot():
if self.slotTooltipIndex == value.GetIndex():
return
self.slotTooltipIndex = value.GetIndex()
if event == None:
self.__SetTooltip(value.GetInfo())
else:
event(value)
return
self.itemTooltip.Hide()
self.slotTooltipIndex = -1
def RefreshMyShopPage(self):
self.pageCategory = "my_shop"
for board in self.pageBoards.values():
board.Hide()
self.pageBoards["my_shop"].Show()
name = self.ShopOpenInfo["name"]
if '@' in name:
name = name[name.find('@')+1:]
self.MyShopShopTitle.SetText(name + " " + localeInfo.OFFLINESHOP_ITEMS_COUNT_TEXT%self.ShopOpenInfo["count"])
self.MyShopShopDuration.SetText(localeInfo.BATTLEPASS_TEXT_7 + GetDurationStringRB(self.ShopOpenInfo["duration"]) + localeInfo.OFFLINE_SHOP_MAX_DAYS)
self.MyShopItemsTable.ClearElement()
for item_info in self.ShopItemForSale:
slot = Slot()
slot.SetInfo(item_info)
slot.SetIndex(item_info["id"])
slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickInsertedItem)
slot.Show()
self.MyShopItemsTable.AddElement(slot)
for item_info in self.ShopItemSold:
item_info["sold"] = True
slot = Slot(isSold=True)
slot.SetInfo(item_info)
slot.SetIndex(item_info["id"])
slot.Show()
self.MyShopItemsTable.AddElement(slot)
self.MyShopOffersTable.ClearElement()
for info in self.MyShopOffers:
itemname = ""
for saleitem in self.ShopItemForSale:
if saleitem["id"] == info["item_id"]:
item.SelectItem(saleitem["vnum"])
itemname = item.GetItemName()
break
if not itemname:
continue
offer = Offer(info)
offer.Show()
offer.SetItemName(itemname)
if not info["is_accept"]:
offer.SetAcceptButtonEvent(self.__OnClickMyShopOfferAcceptButton)
offer.SetDeleteButtonEvent(self.__OnClickMyShopOfferCancelButton)
self.MyShopOffersTable.AddElement(offer)
def RefreshShopListPage(self):
self.pageCategory = "shop_list"
for board in self.pageBoards.values():
board.Hide()
self.pageBoards["shop_list"].Show()
self.ShopListTable.ClearElement()
for shop in self.ShopList:
element = ShopListElement(shop)
element.SetOnClickOpenShopButton(self.__OnClickShopListOpenShop)
element.Show()
self.ShopListTable.AddElement(element)
if self.itemTooltip.IsShow():
self.itemTooltip.Hide()
def RefreshOpenShopPage(self):
self.pageCategory = "open_shop"
for board in self.pageBoards.values():
board.Hide()
self.pageBoards["open_shop"].Show()
self.OpenShopItemsTable.ClearElement()
for info in self.ShopItemForSale:
slot = Slot()
slot.SetInfo(info)
slot.SetIndex(info["id"])
slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickShopItem)
slot.Show()
self.OpenShopItemsTable.AddElement(slot)
name = self.ShopOpenInfo["name"]
duration = self.ShopOpenInfo["duration"]
if '@' in name:
name = name[name.find('@')+1:]
self.OpenShopShopTitle.SetText(name+ " " + localeInfo.OFFLINESHOP_ITEMS_COUNT_TEXT%self.ShopOpenInfo["count"])
self.OpenShopShopDuration.SetText(localeInfo.BATTLEPASS_TEXT_7 + GetDurationStringRB(duration) + localeInfo.OFFLINE_SHOP_MAX_DAYS)
def RefreshSearchHistoryPage(self):
self.SearchHistoryTable.ClearElement()
offlineshop.RefreshFilterHistory()
SortByDatetime(self.FilterHistory)
for elm in self.FilterHistory:
newElement = FilterHistoryElement(elm)
newElement.SetButtonEvent(self.__OnClickFilterHistoryElement)
newElement.Show()
self.SearchHistoryTable.AddElement(newElement)
def RefreshMyPatternsPage(self):
self.SearchPatternsTable.ClearElement()
offlineshop.RefreshFilterPatterns()
lst = self.FilterPatterns.values()
SortByDatetime(lst)
for v in lst:
pattern = FilterPatternElement(v)
pattern.SetButtonEvent(self.__OnClickSearchPatternElement)
pattern.Show()
self.SearchPatternsTable.AddElement(pattern)
def RefreshMyOffersPage(self):
self.pageCategory = "my_offers"
for board in self.pageBoards.values():
board.Hide()
self.pageBoards["my_offers"].Show()
self.MyOffersTable.ClearElement()
for info in self.MyOffersList:
offer = MyOffer(info)
offer.Show()
offer.SetCancelButtonEvent(self.__OnClickDeleteMyOfferButton)
slot = offer.slot
if not info['is_accept']:
viewImage = MakeOfferViewImage(info['is_notified'])
slot.AppendChild(viewImage)
viewImage.SetPosition(-20,-10)
viewImage.Show()
#updated 25-01-2020 #topatch
else:
offer.DisableCancelButton()
self.MyOffersTable.AddElement(offer)
def RefreshAuctionListPage(self):
self.pageCategory = "auction_list"
for board in self.pageBoards.values():
board.Hide()
self.pageBoards["auction_list"].Show()
self.AuctionListTable.ClearElement()
for info in self.AuctionListInfo:
elm = AuctionListElement(info)
elm.Show()
elm.SetIndex(info['owner_id'])
elm.SetOnClickOpenAuctionButton(self.__OnClickOpenAuctionButton)
self.AuctionListTable.AddElement(elm)
def RefreshMyAuctionPage(self):
self.pageCategory = "my_auction"
for board in self.pageBoards.values():
board.Hide()
self.pageBoards["my_auction"].Show()
self.MyAuctionOfferTable.ClearElement()
if 'offers' in self.MyAuctionInfo:
for info in SortOffersByPrice(self.MyAuctionInfo['offers']):
elm = AuctionOffer(info)
elm.Show()
self.MyAuctionOfferTable.AddElement(elm)
best_price = GetBestOfferPriceYang(self.MyAuctionInfo.get('offers', []))
if best_price ==0:
min_raise = self.MyAuctionInfo['init_yang']
else:
if best_price < 1000:
min_raise = best_price + 1000
else:
min_raise = long(float(best_price)*1.1)
self.MyAuctionBestOffer.SetText(localeInfo.NumberToMoneyString(best_price))
self.MyAuctionDuration.SetText(GetDurationString(self.MyAuctionInfo['duration']))
self.MyAuctionMinRaise.SetText(localeInfo.NumberToMoneyString(min_raise))
self.MyAuctionOwnerName.SetText(self.MyAuctionInfo['owner_name'])
if 'item' in self.MyAuctionInfo:
self.__MakeMyAuctionSlot(self.MyAuctionInfo['item'])
def RefreshOpenAuctionPage(self):
self.pageCategory = "open_auction"
for board in self.pageBoards.values():
board.Hide()
self.pageBoards["open_auction"].Show()
self.OpenAuctionOfferTable.ClearElement()
if 'offers' in self.OpenAuctionInfo:
for info in SortOffersByPrice(self.OpenAuctionInfo['offers']):
elm = AuctionOffer(info)
elm.Show()
self.OpenAuctionOfferTable.AddElement(elm)
best_price = GetBestOfferPriceYang(self.OpenAuctionInfo.get('offers' , []))
if best_price == 0:
min_raise = self.OpenAuctionInfo['init_yang']
else:
if best_price < 1000:
min_raise = best_price + 1000
else:
min_raise = long(float(best_price) * 1.1)
self.OpenAuctionInfo['min_raise'] = min_raise
self.OpenAuctionBestOffer.SetText(localeInfo.NumberToMoneyString(best_price))
self.OpenAuctionDuration.SetText(GetDurationString(self.OpenAuctionInfo['duration']))
self.OpenAuctionMinRaise.SetText(localeInfo.NumberToMoneyString(min_raise))
self.OpenAuctionOwnerName.SetText(self.OpenAuctionInfo['owner_name'])
if 'item' in self.OpenAuctionInfo:
self.__MakeOpenAuctionSlot(self.OpenAuctionInfo['item'])
class CategoryButton(ui.Button):
def __init__(self, parent, parentClass, name, category_id):
ui.Button.__init__(self)
self.active = False
self.categoryId = category_id
self.subButtons = []
self.parent = parentClass
self.parentNode = parent
self.SetParent(parent)
self.SetUpVisual("d:/ymir work/ui/game/shopsearchp2p/button_01.png")
self.SetOverVisual("d:/ymir work/ui/game/shopsearchp2p/button_02.png")
self.SetDownVisual("d:/ymir work/ui/game/shopsearchp2p/button_03.png")
self.SetDisableVisual("d:/ymir work/ui/game/shopsearchp2p/button_03.png")
self.SAFE_SetEvent(self.event)
icons = [1, 2, 5, 17, 27, 28, 29, 33, 38]
iconspng = [10, 12, 23, 34]
if (category_id in icons):
self.icon = ui.ImageBox()
self.icon.SetParent(self)
self.icon.SetPosition(185/2-85, 5)
self.icon.LoadImage("d:/ymir work/ui/game/shopsearchp2p/icon/%d.dds" % category_id)
self.icon.Show()
if (category_id in iconspng):
self.icon = ui.ImageBox()
self.icon.SetParent(self)
self.icon.SetPosition(185/2-85, 5)
self.icon.LoadImage("d:/ymir work/ui/game/shopsearchp2p/icon/%d.png" % category_id)
self.icon.Show()
self.valueName = ui.TextLine()
self.valueName.SetParent(self)
self.valueName.SetPosition(185/2-60, 5)
self.valueName.SetText(name)
self.valueName.Show()
self.Show()
def SetPositionHelper(self, x, y):
self.SetPosition(x, y)
for i in range(len(self.subButtons)):
y += 28
self.subButtons[i][0].SetPosition(0, y)
def UpdateSubButtons(self, category, subcategory):
if category == self.categoryId and subcategory == 255:
self.Disable()
else:
self.Enable()
for i in range(len(self.subButtons)):
if self.subButtons[i][1] == subcategory and self.categoryId == category:
self.subButtons[i][0].Disable()
else:
self.subButtons[i][0].Enable()
def event(self):
self.active = self.active != True
if self.active or len(self.subButtons) == 0:
self.parent.SetCategory(self.categoryId, 255)
for i in range(len(self.subButtons)):
if self.active:
self.subButtons[i][0].Show()
else:
self.subButtons[i][0].Hide()
self.parent.RefreshButtons()
def __del__(self):
ui.Button.__del__(self)
def AddSubButton(self, name, subcategory):
button = ui.Button()
button.SetParent(self.parentNode)
button.SetUpVisual("d:/ymir work/ui/game/shopsearchp2p/button_01.png")
button.SetOverVisual("d:/ymir work/ui/game/shopsearchp2p/button_02.png")
button.SetDownVisual("d:/ymir work/ui/game/shopsearchp2p/button_03.png")
button.SetDisableVisual("d:/ymir work/ui/game/shopsearchp2p/button_03.png")
button.SetText(name)
button.SAFE_SetEvent(self.parent.SetCategory, self.categoryId, subcategory)
button.Hide()
self.subButtons.append([button, subcategory])
return button
class ExpandingMenu(ui.Button):
ANIMATION_DURATION = 0.3
def __init__(self, parent, name):
ui.Button.__init__(self)
self.SetParent(parent)
self.name = name
self.animationStart = 0
self.animation = 0
self.isExpanded = False
self.parent = parent
self.menuOptions = []
self.valueName = ui.TextLine()
self.valueName.SetParent(self)
self.valueName.SetPosition(185/2-60, 5)
self.valueName.SetText(name)
self.valueName.Show()
self.SetUpVisual("d:/ymir work/ui/game/shopsearchp2p/button_01.png")
self.SetOverVisual("d:/ymir work/ui/game/shopsearchp2p/button_02.png")
self.SetDownVisual("d:/ymir work/ui/game/shopsearchp2p/button_01.png")
self.SAFE_SetEvent(self.OnClick)
self.OnUpdate()
self.Show()
def OnClick(self):
if app.GetGlobalTimeStamp() - self.animationStart < ExpandingMenu.ANIMATION_DURATION:
return
if self.isExpanded:
self.Collapse()
else:
self.Expand()
def AddMenuOption(self, name, event, *args):
button = ui.Button()
button.SetParent(self.parent)
button.SetUpVisual("d:/ymir work/ui/game/shopsearchp2p/button_01.png")
button.SetOverVisual("d:/ymir work/ui/game/shopsearchp2p/button_02.png")
button.SetDownVisual("d:/ymir work/ui/game/shopsearchp2p/button_01.png")
button.SetText(name)
button.name = name
button.Hide()
event = ui.__mem_func__(event)
button.SAFE_SetEvent(self.SubEvent, button, event, *args)
self.menuOptions.append(button)
return button
def SubEvent(self, btn, event, *args):
self.valueName.SetText(localeInfo.OFFLINE_SHOP_MENU_ % btn.name)
event(*args)
def OnUpdate(self):
if self.animation != 0:
timeDiff = app.GetTime() - self.animationStart
percent = min(1.0, 1.0 * timeDiff / ExpandingMenu.ANIMATION_DURATION)
yProgress = percent
if self.animation == -1:
yProgress = 1.0 - percent
(x, y) = self.GetLocalPosition()
h = self.GetHeight() - 1
for btn, i in zip(self.menuOptions, xrange(1, 1 + len(self.menuOptions))):
btnY = y + (i * h * yProgress)
btn.SetPosition(426, btnY)
if percent == 1.0:
if self.animation == 1:
self.isExpanded = True
else:
self.isExpanded = False
for btn in self.menuOptions:
btn.Hide()
self.animation = 0
self.SetTop()
def Expand(self):
(x, y) = self.GetLocalPosition()
for btn in self.menuOptions:
btn.SetPosition(x, y)
btn.Show()
self.SetTop()
self.animationStart = app.GetTime()
self.animation = 1
def Collapse(self):
self.SetTop()
self.animationStart = app.GetTime()
self.animation = -1
def __del__(self):
ui.Button.__del__(self)
import localeInfo
import app
import grp
WINDOW_WIDTH = 627
WINDOW_HEIGHT = 576
ROOT_PATH = "scripts/offlineshop/"
ROOT = "locale/ro/ui/login/loading/"
LOCALE_PATH = "d:/ymir work/ui/game/shopsearchp2p/"
SEARCH_AND_FILTER_BACKGROUND = "scripts/offlineshop/background_593_500.png"
SAFEBOX_WITHDRAW_BUTTON = "offlineshop/safebox/withdrawyang_%s.png"
window = {
"name" : "OfflineshopBoard",
"style" : ("movable", "float",),
"x" : SCREEN_WIDTH/2 - WINDOW_WIDTH/2,
"y" : SCREEN_HEIGHT/2 - WINDOW_HEIGHT/2,
"width" : WINDOW_WIDTH,
"height" : WINDOW_HEIGHT,
"children" :
(
{
"name" : "MainBoard",
"type" : "shop_board",
"style" : ("attach",),
"x" : 0,
"y" : 0,
"width" : WINDOW_WIDTH,
"height" : WINDOW_HEIGHT,
"children" :
(
# TITLEBAR
{
"name" : "TitleBar",
"type" : "titlebar",
"x" : 8,
"y" : 7,
"width" : WINDOW_WIDTH - 15,
"color" : "red",
"children" :
(
{ "name":"TitleName", "type":"text", "x":0, "y": -1, "text":"Offline Shop", "all_align":"center" },
),
},
# MENU
{
"name": "Menu",
"type": "window",
"x": 18,
"y": 26,
"width" : 593,
"height": 40,
"children":
(
{
"name": "MyShopButton",
"type": "button",
"x" : 0,
"y" : 10.5,
"default_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_skin_normal.dds",
"over_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_skin_hover.dds",
"down_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_skin_pressed.dds",
"disable_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_skin_pressed.dds",
},
{
"name": "MyAuctionButton",
"type": "button",
"x" : 48,
"y" : 10.5,
"default_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_log_normal.dds",
"over_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_log_hover.dds",
"down_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_log_active.dds",
"disable_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_log_active.dds",
},
{
"name": "ShopSafeboxButton",
"type": "button",
"x" : 48*2,
"y" : 10.5,
"default_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_safebox_normal.dds",
"over_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_safebox_hover.dds",
"down_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_safebox_pressed.dds",
},
{
"name": "SearchFilterButton",
"type": "button",
"x" : 48*3,
"y" : 10.5,
"default_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_search_normal.dds",
"over_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_search_hover.dds",
"down_image" : "d:/ymir work/ui/game/shopsearchp2p/shop_btn_search_pressed.dds",
},
),
},
#MyShop_noShop
{
"name" : "MyShopBoardNoShop",
"type" : "window",
"width" : 621, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name" : "BackGroundCreate",
"type" : "image",
"x" : 15, "y" : 0,
"image": ROOT_PATH + "background_593_500.png",
"children" : (
# SLOTBAR_NAME
{
"name" : "ShopNameSlot",
"type" : "slotbar_rb",
"x" : 147,
"y" : 8,
"width" : 297,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "ShopNameInput",
"type" : "editline",
"x" : 3,
"y" : 3,
"width" : 291,
"height" : 15,
"input_limit" : 35,
"text" : "",
},
),
},
# DAYS
{
"name" : "DecreaseDaysButton",
"type" : "button",
"x" : 170,
"y" : 34,
"default_image" : ROOT_PATH + "decrease_flr.png",
"over_image" : ROOT_PATH + "decrease_hover_flr.png",
"down_image" : ROOT_PATH + "decrease_down_flr.png",
},
{
"name" : "DaysSlot",
"type" : "slotbar_rb",
"x" : 187,
"y" : 35,
"width" : 38,
"height" : 17,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" : (
{
"name" : "DaysCountText",
"type" : "text",
"x" : 19,
"y" : 2,
"text" : "0",
"text_horizontal_align" : "center",
},
),
},
{
"name" : "IncreaseDaysButton",
"type" : "button",
"x" : 228,
"y" : 34,
"default_image" : ROOT_PATH + "increase_flr.png",
"over_image" : ROOT_PATH + "increase_hover_flr.png",
"down_image" : ROOT_PATH + "increase_down_flr.png",
},
# HOURS
{
"name" : "DecreaseHoursButton",
"type" : "button",
"x" : 349,
"y" : 34,
"default_image" : ROOT_PATH + "decrease_flr.png",
"over_image" : ROOT_PATH + "decrease_hover_flr.png",
"down_image" : ROOT_PATH + "decrease_down_flr.png",
},
{
"name" : "HoursSlot",
"type" : "slotbar_rb",
"x" : 366,
"y" : 35,
"width" : 38,
"height" : 17,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" : (
{
"name" : "HoursCountText",
"type" : "text",
"x" : 19,
"y" : 2,
"text" : "0",
"text_horizontal_align" : "center",
},
),
},
{
"name" : "IncreaseHoursButton",
"type" : "button",
"x" : 407,
"y" : 34,
"default_image" : ROOT_PATH + "increase_flr.png",
"over_image" : ROOT_PATH + "increase_hover_flr.png",
"down_image" : ROOT_PATH + "increase_down_flr.png",
},
# MAX_DURATION
{
"name" : "MaxDurationText",
"type" : "text",
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_MAX_DURATION_TEXT,
"color" : 0xfff4ead5,
"x" : 248+48, "y" :55,
},
# CREATE_BUTTON
{
"name" : "CreateShopButton",
"type" : "button",
"x" : 254.5,
"y" : 450,
"default_image" : LOCALE_PATH + "btn_save_normal.dds",
"over_image" : LOCALE_PATH + "btn_save_hover.dds",
"down_image" : LOCALE_PATH + "btn_save_pressed.dds",
},
),
},
),
},
#MyShop_Owner
{
"name" : "MyShopBoard",
"type" : "window",
"width" : 621, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name" : "BackgroundMySHop",
"type" : "image",
"x" : 15, "y" : 0,
"image" : ROOT_PATH + "my_shop_bg.png",
"children" : (
# SLOTBAR_NAME
{
"name" : "ShopNameSlot",
"type" : "slotbar_rb",
"x" : 16,
"y" : 8,
"width" : 297,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "MyShopShopTitle",
"type" : "text",
"x" : 3,
"y" : 3,
# "text_horizontal_align" : "center",
"text" : "",
},
),
},
# EditName Button
{
"name" : "MyShopEditTitleButton",
"type" : "button",
"x" : 319, "y" : 8,
"tooltip_text" : localeInfo.OFFLINESHOP_EDIT_SHOPNAME_TOOLTIP,
"tooltip_x" : 40,
"tooltip_y" : 0,
"default_image" : "d:/ymir work/ui/game/shopsearchp2p/checkbutton.dds",
"over_image" : "d:/ymir work/ui/game/shopsearchp2p/checkbutton_over.dds",
"down_image" : "d:/ymir work/ui/game/shopsearchp2p/checkbutton_down.dds",
},
# DURATION
{
"name" : "MyShopShopDuration",
"type" : "text",
"x" : 354,
"y" : 10,
"fontname" : "Arial:12",
"text": "Remaining time: 1d 23h 59m / 3Days",
},
# CLOSE SHOP BUTTON
{
"name" : "MyShopCloseButton",
"type" : "button",
"x" : 535,
"y" : 8,
"default_image" : "d:/ymir work/ui/game/shopsearchp2p/closebutton.tga",
"over_image" : "d:/ymir work/ui/game/shopsearchp2p/closebutton_over.tga",
"down_image" : "d:/ymir work/ui/game/shopsearchp2p/closebutton_down.tga",
"tooltip_text" : localeInfo.OFFLINESHOP_SCRIPTFILE_CLOSE_SHOP_TEXT,
"tooltip_x" : 40,
"tooltip_y" : 0,
},
# GAUGE
{
"name":"Shop_Time_Gauge_Slot",
"type":"image",
"x" : 136.5,
"y" : 358,
# "vertical_align" : "bottom",
"image" : "d:/ymir work/ui/game/shopsearchp2p/timegauge.dds",
"children" :
(
{
"name" : "Shop_Time_Gauge",
"type" : "ani_image",
"x" : 4,
"y" : 0,
"delay" : 6,
"images" :
(
"D:/Ymir Work/UI/game/shopsearchp2p/timeGauge/01.tga",
"D:/Ymir Work/UI/game/shopsearchp2p/timeGauge/02.tga",
"D:/Ymir Work/UI/game/shopsearchp2p/timeGauge/03.tga",
"D:/Ymir Work/UI/game/shopsearchp2p/timeGauge/04.tga",
"D:/Ymir Work/UI/game/shopsearchp2p/timeGauge/05.tga",
"D:/Ymir Work/UI/game/shopsearchp2p/timeGauge/06.tga",
"D:/Ymir Work/UI/game/shopsearchp2p/timeGauge/07.tga",
),
},
),
},
),
},
# BACKGROUND_OFFER
{
"name" : "BackgroundMyShopOffer",
"type" : "image",
"x" : 15,
"y" : 383,
"image" : ROOT_PATH + "background_593_110.png",
"children" : (
# OFFER
{
"name" : "OfferUserName",
"type" : "text",
"x" : 55+25,
"y" : 5,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_OWNER_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "OfferItemName",
"type" : "text",
"x" : 217+21,
"y" : 5,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_ITEM_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "OfferPrice",
"type" : "text",
"x" : 365+26,
"y" : 5,
"text_horizontal_align" : "center",
"text" : "Yang:",
"color" : 0xfff4ead5,
},
{
"name" : "OfferAction",
"type" : "text",
"x" : 525+10,
"y" : 5,
"text_horizontal_align" : "center",
"text" : "OfferAction",
"color" : 0xfff4ead5,
},
),
},
),
},
#shoplist_open
{
"name" : "ListOfShop_OpenShop",
"type" : "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name" : "BackgroundShopListOpen",
"type" : "image",
"x" : 15, "y" : 0,
"image" : ROOT_PATH + "background_593_500.png",
"children" : (
# BACK BUTTON
{
"name" : "OpenShopBackToListButton",
"type" : "button",
"x" : 16, "y" : 7,
"default_image" : "d:/ymir work/ui/game/shopsearchp2p/btn_back_normal.dds",
"over_image" : "d:/ymir work/ui/game/shopsearchp2p/btn_back_over.dds",
"down_image" : "d:/ymir work/ui/game/shopsearchp2p/btn_back_down.dds",
},
# SLOT_SHOP_NAME
{
"name" : "ShopNameSlot",
"type" : "slotbar_rb",
"x" : 147,
"y" : 7,
"width" : 297,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "OpenShopShopTitle",
"type" : "text",
"x" : 3,
"y" : 3,
# "text_horizontal_align" : "center",
"text" : "",
},
),
},
{
"name" : "OpenShopShopDuration",
"type" : "text",
"x" : 300, "y" : 27,
"text_horizontal_align" : "center",
"text" : "99 days",
},
),
},
),
},
#shoplist_list
{
"name" : "ListOfShop_List",
"type" : "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name" : "BackgroundShopList",
"type" : "image",
"x" : 15, "y" : 0,
"image" : ROOT_PATH + "background_593_500.png",
"children" : (
{
"name" : "ShopListName",
"type" : "text",
"x" : 30+19,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_OWNER_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "OfferItemName",
"type" : "text",
"x" : 175+23,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_SHOPS_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "OfferPrice",
"type" : "text",
"x" : 335+21,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_DURATION_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "OfferAction",
"type" : "text",
"x" : 485+24,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_ITEMS_COUNT_TEXT_1,
"color" : 0xfff4ead5,
},
),
},
),
},
#safebox
{
"name": "ShopSafeboxPage",
"type": "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name": "BackgroundShopSafeboxPage",
"type": "image",
"x": 15, "y": 0,
"image": ROOT_PATH + "background_593_500.png",
"children" : (
{
"name" : "SlotYang",
"type" : "slotbar_rb",
"x" : 198,
"y" : 4,
"width" : 194,
"height" : 31,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" : (
{
"name" : "ShopSafeboxWithdrawYangButton",
"type" : "button",
"x" : 33-8,
"y" : 7.5,
"default_image" : SAFEBOX_WITHDRAW_BUTTON%"default",
"over_image" : SAFEBOX_WITHDRAW_BUTTON%"over",
"down_image" : SAFEBOX_WITHDRAW_BUTTON%"down",
},
),
},
),
},
{
"name" : "ShopSafeboxValuteText",
"type" : "text",
"x" : 468-154,
"y" : 22-8,
"text_horizontal_align" : "center",
"text" : "000000",
},
),
},
#searchhistory
{
"name" : "SearchHistoryBoard",
"type" : "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name" : "BackgroundSearchHistory",
"type" : "image",
"x" : 15, "y" : 0,
"image" : ROOT_PATH + "background_593_500.png",
"children" : (
{
"name" : "SearchHistoryDate",
"type" : "text",
"x" : 55+33,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_DATE_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "SearchHistoryTime",
"type" : "text",
"x" : 247+32,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_TIME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "SearchHistoryResult",
"type" : "text",
"x" : 475+13,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_ITEMS_COUNT_TEXT_1,
"color" : 0xfff4ead5,
},
),
},
),
},
#mypatterns
{
"name" : "MyPatternsBoard",
"type" : "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name" : "BackgroundMyPatterns",
"type" : "image",
"x" : 15, "y" : 0,
"image" : ROOT_PATH + "background_593_500.png",
"children" : (
{
"name" : "MyPatternsName",
"type" : "text",
"x" : 48,
"y" : 2,
"text" : localeInfo.OFFLINESHOP_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "MyPatternTime",
"type" : "text",
"x" : 397+33,
"y" : 2,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_LAST_USE_TEXT,
"color" : 0xfff4ead5,
},
),
},
),
},
#searchfilter
{
"name" : "SearchFilterBoard",
"type" : "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name" : "BackgroundSearchFilter",
"type" : "image",
"x" : 15, "y" : 0,
"image" : SEARCH_AND_FILTER_BACKGROUND,
"children" : (
# TEXTS
{
"name" : "ItemNameText",
"type" : "text",
"x" : 5+7,
"y" : 8,
"text" : localeInfo.OFFLINESHOP_ITEM_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "RaceText",
"type" : "text",
"x" : 5+7,
"y" : 8+69,
"text" : localeInfo.OFFLINESHOP_RACE_TEXT,
"color" : 0xfff4ead5,
},
# SLOT_INPUT_NAME
{
"name" : "ItemNameSlot",
"type" : "image",
"x" : 5,
"y" : 22,
"image" : LOCALE_PATH + "insert.dds",
"children" :
(
{
"name" : "SearchFilterItemNameInput",
"type" : "editline",
"x" : 5,
"y" : 5,
"width" : 149,
"height" : 15,
"input_limit" : 24,
"text" : "",
"children" :
(
{
"name" : "SearchFilterItemNameInput_Hint",
"type" : "text",
"x" : 0,
"y" : 0,
"color" : grp.GenerateColor(1.0, 1.0, 1.0, 0.5),
},
),
},
{
"name" : "ItemNameEraseBtn",
"type" : "button",
"x" : 154,
"y" : 5,
"default_image" : LOCALE_PATH + "x_btn_default.dds",
"over_image" : LOCALE_PATH + "x_btn_hover.dds",
"down_image" : LOCALE_PATH + "x_btn_down.dds",
},
),
},
# Main Board Scroll
{
"name" : "ContainerScrollBar",
"type" : "slimscrollbar",
"x" : 204+365+15,
"y" : 19,
"size" : 480,
},
# SLOT_RACES
# {
# "name" : "RacesSlot",
# "type" : "image",
# "x" : 5,
# "y" : 82,
# "image" : ROOT_PATH + "ss_races_bg.png",
# },
{
"name" : "CategoryContainer",
"type" : "window",
"x" : 5,
"y" : 135,
"width" : 185,
"height" : 377,
# "image" : ROOT_PATH + "category_container_bg.png",
},
# Left Board Scroll
{
"name" : "CategoryScrollBar",
"type" : "slimscrollbar",
"x" : 185-5,
"y" : 133,
"size" : 369,
},
# BTN_RESET
{
"name" : "SearchFilterResetFilterButton",
"type" : "button",
"x" : 213, "y" : 477,
"default_image" : LOCALE_PATH + "btn_reset_normal.dds",
"over_image" : LOCALE_PATH + "btn_reset_hover.dds",
"down_image" : LOCALE_PATH + "btn_reset_pressed.dds",
},
# BTN_SEARCH
{
"name" : "SearchFilterStartSearch",
"type" : "button",
"x" : 348, "y" : 477,
"default_image" : LOCALE_PATH + "btn_search_normal.tga",
"over_image" : LOCALE_PATH + "btn_search_hover.tga",
"down_image" : LOCALE_PATH + "btn_search_pressed.tga",
},
# BTN_SAVE
{
"name" : "SearchFilterSavePatternButton",
"type" : "button",
"x" : 483, "y" : 477,
"default_image" : LOCALE_PATH + "btn_save_normal.dds",
"over_image" : LOCALE_PATH + "btn_save_hover.dds",
"down_image" : LOCALE_PATH + "btn_save_pressed.dds",
},
),
},
),
},
#my offers
{
"name": "MyOffersPage",
"type": "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name": "BackgroundMyOffersPage",
"type": "image",
"x": 15, "y": 0,
"image": ROOT_PATH + "background_593_500.png",
"children" : (
{
"name" : "HeaderText",
"type" : "text",
"x" : 271,
"y" : 10,
"text" : localeInfo.OFFLINESHOP_TITLE_MY_OFFERS,
"color" : 0xfff4ead5,
},
),
},
),
},
# my auction
{
"name": "MyAuction",
"type": "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name": "BackgroundMyAuctionPage",
"type": "image",
"x": 15, "y": 0,
"image" : ROOT_PATH + "background_593_500.png",
"children" : (
{
"name" : "OpenAuctionItemBG",
"type" : "image",
"x" : 146.5,
"y" : 13,
"image" : ROOT_PATH + "open_auction_.png",
"children" : (
# LEFT_DATA
{
"name" : "MyAuctionOwner",
"type" : "text",
"x" : 5,
"y" : 17,
"text" : localeInfo.OFFLINESHOP_OWNER_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "MyAuctionDuration",
"type" : "text",
"x" : 5,
"y" : 17+24,
"text" : localeInfo.OFFLINESHOP_DURATION_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "MyAuctionBestOffer",
"type" : "text",
"x" : 5,
"y" : 17+24*2,
"text" : localeInfo.OFFLINESHOP_BEST_OFFER_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "MyAuctionMinRaise",
"type" : "text",
"x" : 5,
"y" : 17+24*3,
"text" : localeInfo.OFFLINESHOP_MIN_RAISE_TEXT,
"color" : 0xfff4ead5,
},
# SLOTS_INPUTS
{
"name" : "OpenAuctionSlotOwner",
"type" : "slotbar_rb",
"x" : 88,
"y" : 15,
"width" : 150,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "MyAuction_OwnerName",
"type" : "text",
"x" : 3,
"y" : 3,
"text" : "",
},
),
},
{
"name" : "OpenAuctionSlotDuration",
"type" : "slotbar_rb",
"x" : 88,
"y" : 15+24,
"width" : 150,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "MyAuction_Duration",
"type" : "text",
"x" : 3,
"y" : 3,
"text" : "",
},
),
},
{
"name" : "OpenAuctionSlotBestOffer",
"type" : "slotbar_rb",
"x" : 88,
"y" : 15+24*2,
"width" : 150,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "MyAuction_BestOffer",
"type" : "text",
"x" : 3,
"y" : 3,
"text" : "",
},
),
},
{
"name" : "OpenAuctionSlotMinRaise",
"type" : "slotbar_rb",
"x" : 88,
"y" : 15+24*3,
"width" : 150,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "MyAuction_MinRaise",
"type" : "text",
"x" : 3,
"y" : 3,
"text" : "",
},
),
},
),
},
{
"name" : "DataTitle",
"type" : "image",
"x" : 0,
"y" : 136,
"image" : ROOT_PATH + "top_background.png",
"children" : (
{
"name" : "DataTitleUser",
"type" : "text",
"x" : 173+13,
"y" : 8,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "DataTitleOffer",
"type" : "text",
"x" : 392+9,
"y" : 8,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_OFFER_TEXT,
"color" : 0xfff4ead5,
},
),
},
),
},
),
},
# open acution
{
"name": "OpenAuction",
"type": "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name": "BackgroundOpenAuctionPage",
"type": "image",
"x": 15, "y": 0,
"image" : ROOT_PATH + "background_593_500.png",
"children" : (
# BACK BUTTON
{
"name" : "OpenAuctionBackToListButton",
"type" : "button",
"x" : 16, "y" : 13,
"default_image" : "d:/ymir work/ui/game/shopsearchp2p/btn_back_normal.dds",
"over_image" : "d:/ymir work/ui/game/shopsearchp2p/btn_back_over.dds",
"down_image" : "d:/ymir work/ui/game/shopsearchp2p/btn_back_down.dds",
},
{
"name" : "OpenAuctionItemBG",
"type" : "image",
"x" : 146.5,
"y" : 13,
"image" : ROOT_PATH + "open_auction_.png",
"children" : (
# LEFT_DATA
{
"name" : "OpenAuctionOwner",
"type" : "text",
"x" : 5,
"y" : 17,
"text" : localeInfo.OFFLINESHOP_OWNER_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "OpenAuctionDuration",
"type" : "text",
"x" : 5,
"y" : 17+24,
"text" : localeInfo.OFFLINESHOP_DURATION_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "OpenAuctionBestOffer",
"type" : "text",
"x" : 5,
"y" : 17+24*2,
"text" : localeInfo.OFFLINESHOP_BEST_OFFER_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "OpenAuctionMinRaise",
"type" : "text",
"x" : 5,
"y" : 17+24*3,
"text" : localeInfo.OFFLINESHOP_MIN_RAISE_TEXT,
"color" : 0xfff4ead5,
},
# SLOTS_INPUTS
{
"name" : "OpenAuctionSlotOwner",
"type" : "slotbar_rb",
"x" : 74,
"y" : 15,
"width" : 150,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "OpenAuction_OwnerName",
"type" : "text",
"x" : 3,
"y" : 3,
# "text_horizontal_align" : "center",
"text" : "",
},
),
},
{
"name" : "OpenAuctionSlotDuration",
"type" : "slotbar_rb",
"x" : 74,
"y" : 15+24,
"width" : 150,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "OpenAuction_Duration",
"type" : "text",
"x" : 3,
"y" : 3,
# "text_horizontal_align" : "center",
"text" : "",
},
),
},
{
"name" : "OpenAuctionSlotBestOffer",
"type" : "slotbar_rb",
"x" : 74,
"y" : 15+24*2,
"width" : 150,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "OpenAuction_BestOffer",
"type" : "text",
"x" : 3,
"y" : 3,
# "text_horizontal_align" : "center",
"text" : "",
},
),
},
{
"name" : "OpenAuctionSlotMinRaise",
"type" : "slotbar_rb",
"x" : 74,
"y" : 15+24*3,
"width" : 150,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "OpenAuction_MinRaise",
"type" : "text",
"x" : 3,
"y" : 3,
# "text_horizontal_align" : "center",
"text" : "",
},
),
},
),
},
{
"name" : "DataTitle",
"type" : "image",
"x" : 0,
"y" : 136,
"image" : ROOT_PATH + "top_background.png",
"children" : (
{
"name" : "DataTitleUser",
"type" : "text",
"x" : 173,
"y" : 8,
"text" : localeInfo.OFFLINESHOP_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "DataTitleOffer",
"type" : "text",
"x" : 392,
"y" : 8,
"text" : localeInfo.OFFLINESHOP_OFFER_TEXT,
"color" : 0xfff4ead5,
},
),
},
),
},
),
},
# acutionlist
{
"name": "AuctionList",
"type": "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name": "BackgroundAuctionListPage",
"type": "image",
"x" : 15, "y" : 0,
"image" : ROOT_PATH + "background_593_500.png",
"children" : (
{
"name" : "AuctionListOwnerName",
"type" : "text",
"x" : 33+19,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_OWNER_NAME_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "AuctionListBestOffer",
"type" : "text",
"x" : 180+22,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_BEST_OFFER_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "AuctionListDuration",
"type" : "text",
"x" : 335+20,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_DURATION_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "AuctionListNOffer",
"type" : "text",
"x" : 470+40,
"y" : 3,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_OFFER_COUNT_TEXT,
"color" : 0xfff4ead5,
},
),
},
),
},
#create auction
{
"name": "CreateAuction",
"type": "window",
"width" : 622, "height" : 500,
"x" : 3, "y" : 26+38,
"children":
(
{
"name": "BackgroundCreateAuctionPage",
"type": "image",
"x": 15, "y": 0,
"image": ROOT_PATH + "my_shop_bg.png",
"children" : (
{
"name" : "BackgroundCreateAuctionMain",
"type" : "image",
"x" : 146.5,
"y" : 130.5,
"image" : ROOT_PATH + "open_auction_.png",
"children" : (
{
"name": "CreateAuctionDecreaseDaysButton",
"type": "button",
"x" : 181,
"y" : 19,
"default_image" : ROOT_PATH + "increase_flr.png",
"over_image" : ROOT_PATH + "increase_hover_flr.png",
"down_image" : ROOT_PATH + "increase_down_flr.png",
},
{
"name" : "CreateAuctionIncreaseDaysButton",
"type" : "button",
"x": 85,
"y": 19,
"default_image" : ROOT_PATH + "decrease_flr.png",
"over_image" : ROOT_PATH + "decrease_hover_flr.png",
"down_image" : ROOT_PATH + "decrease_down_flr.png",
},
# SLOTS_INPUTS
{
"name" : "CreateAuctionSlotDays",
"type" : "slotbar_rb",
"x" : 102,
"y" : 20,
"width" : 76,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" : (
{
"name": "CreateAuctionDaysInput",
"type": "text",
"width": 23, "height": 17,
"text_horizontal_align" : "center",
"text" : "0",
"x": 37, "y": 2,
},
),
},
{
"name" : "CreateAuctionDuration",
"type" : "text",
"x" : 142,
"y" : 5,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_DURATION_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "CreateAuctionStartPrice",
"type" : "text",
"x" : 142,
"y" : 45,
"text_horizontal_align" : "center",
"text" : localeInfo.OFFLINESHOP_STARTING_PRICE_TEXT,
"color" : 0xfff4ead5,
},
{
"name" : "CreateAuctionSlotPrice",
"type" : "slotbar_rb",
"x" : 65,
"y" : 60,
"width" : 150,
"height" : 18,
"color_left" : 0xff2A2522,
"color_right" : 0xff433B38,
"color_center" : 0xff000000,
"children" :
(
{
"name" : "CreateAuctionStartingPriceInput",
"type" : "editline",
"x" : 3,
"y" : 3,
"width" : 144,
"height" : 15,
"input_limit": 10,
"only_number": 1,
},
),
},
# CREATE_AUCTION
{
"name" : "CreateAuctionCreateAuctionButton",
"type" : "button",
"x" : 98, "y" : 89,
"default_image" : LOCALE_PATH + "btn_save_normal.dds",
"over_image" : LOCALE_PATH + "btn_save_hover.dds",
"down_image" : LOCALE_PATH + "btn_save_pressed.dds",
},
),
},
),
},
),
},
{
"name" : "AnimationWindow",
"type" : "ani_image",
"x" : -27, "y" : -15,
"vertical_align" : "center",
"horizontal_align" : "center",
"delay" : 2.5,
"images" :
(
ROOT + "img0001.png",
ROOT + "img0002.png",
ROOT + "img0003.png",
ROOT + "img0004.png",
ROOT + "img0005.png",
ROOT + "img0006.png",
ROOT + "img0007.png",
ROOT + "img0008.png",
ROOT + "img0009.png",
ROOT + "img0010.png",
ROOT + "img0011.png",
ROOT + "img0012.png",
ROOT + "img0013.png",
ROOT + "img0014.png",
ROOT + "img0015.png",
ROOT + "img0016.png",
ROOT + "img0017.png",
ROOT + "img0018.png",
ROOT + "img0019.png",
ROOT + "img0020.png",
ROOT + "img0021.png",
ROOT + "img0022.png",
ROOT + "img0023.png",
ROOT + "img0024.png",
ROOT + "img0025.png",
ROOT + "img0026.png",
ROOT + "img0027.png",
ROOT + "img0028.png",
ROOT + "img0029.png",
ROOT + "img0030.png",
ROOT + "img0031.png",
)
},
),
},
),
}

