357 lines
9.7 KiB
Lua
357 lines
9.7 KiB
Lua
Market = {}
|
|
|
|
g_ui.importStyle('market.otui')
|
|
g_ui.importStyle('ui/general/markettabs.otui')
|
|
g_ui.importStyle('ui/general/marketbuttons.otui')
|
|
g_ui.importStyle('ui/general/marketcombobox.otui')
|
|
|
|
local marketWindow
|
|
local mainTabBar
|
|
|
|
local marketOffersPanel
|
|
local selectionTabBar
|
|
local browsePanel
|
|
local searchPanel
|
|
|
|
local displaysTabBar
|
|
local itemOffersPanel
|
|
local itemDetailsPanel
|
|
local itemStatsPanel
|
|
|
|
local myOffersPanel
|
|
local offersTabBar
|
|
local currentOffersPanel
|
|
local offerHistoryPanel
|
|
|
|
local marketOffers = {}
|
|
local marketItems = {}
|
|
local depot = {}
|
|
local information ={}
|
|
local selectedItem
|
|
local nameLabel
|
|
|
|
local currentItems = {}
|
|
local itemsPanel
|
|
local radioItemSet
|
|
local filterBox
|
|
|
|
local function getMarketCategoryName(category)
|
|
if table.hasKey(MarketCategoryStrings, category) then
|
|
return MarketCategoryStrings[category]
|
|
end
|
|
end
|
|
|
|
local function getMarketCategoryId(name)
|
|
local id = table.find(MarketCategoryStrings, name)
|
|
if id then
|
|
return id
|
|
end
|
|
end
|
|
|
|
local function clearSelectedItem()
|
|
if selectedItem and selectedItem.item.ptr then
|
|
Market.updateOffers({})
|
|
radioItemSet:selectWidget(nil)
|
|
nameLabel:clearText()
|
|
selectedItem:setItem(nil)
|
|
selectedItem.item = {}
|
|
end
|
|
end
|
|
|
|
local function initMarketItems()
|
|
-- populate all market items
|
|
marketItems = {}
|
|
local types = g_things.findThingTypeByAttr(ThingAttrMarket)
|
|
for idx = 1, #types do
|
|
local t = types[idx]
|
|
local newItem = Item.create(t:getId())
|
|
if newItem then
|
|
local item = {
|
|
ptr = newItem,
|
|
marketData = t:getMarketData()
|
|
}
|
|
table.insert(marketItems, item)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function updateItemsWidget()
|
|
if table.empty(currentItems) then
|
|
return
|
|
end
|
|
|
|
itemsPanel = marketWindow:recursiveGetChildById('itemsPanel')
|
|
local layout = itemsPanel:getLayout()
|
|
layout:disableUpdates()
|
|
|
|
clearSelectedItem()
|
|
itemsPanel:destroyChildren()
|
|
|
|
if radioItemSet then
|
|
radioItemSet:destroy()
|
|
end
|
|
radioItemSet = UIRadioGroup.create()
|
|
|
|
for _, item in pairs(currentItems) do
|
|
local itemBox = g_ui.createWidget('MarketItemBox', itemsPanel)
|
|
local itemWidget = itemBox:getChildById('item')
|
|
|
|
itemBox.item = item
|
|
itemWidget:setItem(item.ptr)
|
|
|
|
radioItemSet:addWidget(itemBox)
|
|
end
|
|
|
|
layout:enableUpdates()
|
|
layout:update()
|
|
end
|
|
|
|
local function loadDepotItems(depotItems)
|
|
information.depotItems = {}
|
|
for _, data in pairs(depotItems) do
|
|
local item = Item.create(data[1])
|
|
if not item then
|
|
break
|
|
end
|
|
item:setCount(data[2])
|
|
local marketData = item:getMarketData()
|
|
|
|
if not table.empty(marketData) then
|
|
local newItem = {
|
|
ptr = item,
|
|
marketData = marketData
|
|
}
|
|
table.insert(information.depotItems, newItem)
|
|
end
|
|
end
|
|
end
|
|
|
|
function Market.init()
|
|
marketWindow = g_ui.createWidget('MarketWindow', rootWidget)
|
|
marketWindow:hide()
|
|
|
|
initMarketItems()
|
|
|
|
-- TODO: clean this up into functions
|
|
-- setup main tabs
|
|
mainTabBar = marketWindow:getChildById('mainTabBar')
|
|
mainTabBar:setContentWidget(marketWindow:getChildById('mainTabContent'))
|
|
|
|
-- setup 'Market Offer' section tabs
|
|
marketOffersPanel = g_ui.loadUI('ui/marketoffers.otui')
|
|
mainTabBar:addTab(tr('Market Offers'), marketOffersPanel)
|
|
|
|
selectionTabBar = marketOffersPanel:getChildById('leftTabBar')
|
|
selectionTabBar:setContentWidget(marketOffersPanel:getChildById('leftTabContent'))
|
|
|
|
browsePanel = g_ui.loadUI('ui/marketoffers/browse.otui')
|
|
selectionTabBar:addTab(tr('Browse'), browsePanel)
|
|
|
|
searchPanel = g_ui.loadUI('ui/marketoffers/search.otui')
|
|
selectionTabBar:addTab(tr('Search'), searchPanel)
|
|
|
|
displaysTabBar = marketOffersPanel:getChildById('rightTabBar')
|
|
displaysTabBar:setContentWidget(marketOffersPanel:getChildById('rightTabContent'))
|
|
|
|
itemOffersPanel = g_ui.loadUI('ui/marketoffers/itemoffers.otui')
|
|
displaysTabBar:addTab(tr('Offers'), itemOffersPanel)
|
|
|
|
itemDetailsPanel = g_ui.loadUI('ui/marketoffers/itemdetails.otui')
|
|
displaysTabBar:addTab(tr('Details'), itemDetailsPanel)
|
|
|
|
itemStatsPanel = g_ui.loadUI('ui/marketoffers/itemstats.otui')
|
|
displaysTabBar:addTab(tr('Statistics'), itemStatsPanel)
|
|
|
|
-- setup 'My Offer' section tabs
|
|
myOffersPanel = g_ui.loadUI('ui/myoffers.otui')
|
|
mainTabBar:addTab(tr('My Offers'), myOffersPanel)
|
|
|
|
offersTabBar = myOffersPanel:getChildById('offersTabBar')
|
|
offersTabBar:setContentWidget(myOffersPanel:getChildById('offersTabContent'))
|
|
|
|
currentOffersPanel = g_ui.loadUI('ui/myoffers/currentoffers.otui')
|
|
offersTabBar:addTab(tr('Current Offers'), currentOffersPanel)
|
|
|
|
offerHistoryPanel = g_ui.loadUI('ui/myoffers/offerhistory.otui')
|
|
offersTabBar:addTab(tr('Offer History'), offerHistoryPanel)
|
|
|
|
nameLabel = marketWindow:recursiveGetChildById('nameLabel')
|
|
selectedItem = marketWindow:recursiveGetChildById('selectedItem')
|
|
selectedItem.item = {}
|
|
|
|
filterBox = browsePanel:getChildById('filterComboBox')
|
|
for i = MarketCategory.First, MarketCategory.Last do
|
|
filterBox:addOption(getMarketCategoryName(i))
|
|
end
|
|
filterBox:setCurrentOption(getMarketCategoryName(MarketCategory.First))
|
|
|
|
filterBox.onOptionChange = function(combobox, option)
|
|
Market.loadMarketItems(getMarketCategoryId(option))
|
|
end
|
|
end
|
|
|
|
function Market.terminate()
|
|
if marketWindow then
|
|
marketWindow:destroy()
|
|
marketWindow = nil
|
|
end
|
|
|
|
mainTabBar = nil
|
|
marketOffersPanel = nil
|
|
selectionTabBar = nil
|
|
browsePanel = nil
|
|
searchPanel = nil
|
|
displaysTabBar = nil
|
|
itemOffersPanel = nil
|
|
itemDetailsPanel = nil
|
|
itemStatsPanel = nil
|
|
myOffersPanel = nil
|
|
offersTabBar = nil
|
|
currentOffersPanel = nil
|
|
offerHistoryPanel = nil
|
|
marketOffers = {}
|
|
marketItems = {}
|
|
depotItems = {}
|
|
information = {}
|
|
currentItems = {}
|
|
itemsPanel = nil
|
|
nameLabel = nil
|
|
radioItemSet = nil
|
|
selectedItem = nil
|
|
filterBox = nil
|
|
|
|
Market = nil
|
|
end
|
|
|
|
function Market.loadMarketItems(_category)
|
|
if table.empty(marketItems) then
|
|
initMarketItems()
|
|
end
|
|
|
|
currentItems = {}
|
|
for _, item in pairs(marketItems) do
|
|
-- filter items here
|
|
local category = item.marketData.category
|
|
if category == _category or _category == MarketCategory[0] then
|
|
table.insert(currentItems, item)
|
|
end
|
|
end
|
|
|
|
updateItemsWidget()
|
|
end
|
|
|
|
function Market.updateOffers(offers)
|
|
marketOffers[MarketAction.Buy] = {}
|
|
marketOffers[MarketAction.Sell] = {}
|
|
|
|
local buyOfferList = marketWindow:recursiveGetChildById('buyingList')
|
|
buyOfferList:destroyChildren()
|
|
|
|
local sellOfferList = marketWindow:recursiveGetChildById('sellingList')
|
|
sellOfferList:destroyChildren()
|
|
|
|
for k, offer in pairs(offers) do
|
|
if offer and offer:getAction() == MarketAction.Buy then
|
|
local label = g_ui.createWidget('OfferListLabel', buyOfferList)
|
|
label:setText(offer:getPlayer()..' '..offer:getAmount()..' '..(offer:getPrice()*offer:getAmount())..' '..offer:getPrice()..' '..offer:getTimeStamp())
|
|
table.insert(marketOffers[MarketAction.Buy], offer)
|
|
else
|
|
local label = g_ui.createWidget('OfferListLabel', sellOfferList)
|
|
label:setText(offer:getPlayer()..' '..offer:getAmount()..' '..(offer:getPrice()*offer:getAmount())..' '..offer:getPrice()..' '..offer:getTimeStamp())
|
|
table.insert(marketOffers[MarketAction.Sell], offer)
|
|
end
|
|
end
|
|
end
|
|
|
|
function Market.updateDetails(itemId, descriptions, purchaseStats, saleStats)
|
|
if not selectedItem then
|
|
return
|
|
end
|
|
selectedItem.item.details = {
|
|
serverItemId = itemId,
|
|
descriptions = descriptions,
|
|
purchaseStats = purchaseStats,
|
|
saleStats = saleStats
|
|
}
|
|
|
|
-- TODO: refresh all widget windows
|
|
end
|
|
|
|
function Market.updateSelectedItem(newItem)
|
|
selectedItem.item = newItem
|
|
if selectedItem and not table.empty(selectedItem.item) then
|
|
if selectedItem.item.ptr then
|
|
selectedItem:setItem(selectedItem.item.ptr)
|
|
nameLabel:setText(selectedItem.item.marketData.name)
|
|
MarketProtocol.sendMarketBrowse(selectedItem.item.ptr:getId()) -- send sprite id browsed
|
|
end
|
|
else
|
|
selectedItem:setItem(nil)
|
|
nameLabel:setText(tr('No item selected.'))
|
|
end
|
|
end
|
|
|
|
function Market.onMarketEnter(depotItems, offers, balance)
|
|
if marketWindow:isVisible() then
|
|
return
|
|
end
|
|
marketWindow:lock()
|
|
marketOffers[MarketAction.Buy] = {}
|
|
marketOffers[MarketAction.Sell] = {}
|
|
|
|
information.balance = balance
|
|
information.totalOffers = offers
|
|
|
|
if table.empty(currentItems) then
|
|
Market.loadMarketItems(MarketCategory.First)
|
|
end
|
|
loadDepotItems(depotItems)
|
|
|
|
-- TODO: if you are already viewing an item on market enter it must recheck the current item
|
|
if selectedItem and selectedItem:isChecked() then
|
|
selectedItem:setChecked(false)
|
|
selectedItem:setChecked(true)
|
|
end
|
|
marketWindow:show()
|
|
end
|
|
|
|
function Market.onMarketLeave()
|
|
marketWindow:hide()
|
|
end
|
|
|
|
function Market.onMarketDetail(itemId, descriptions, purchaseStats, saleStats)
|
|
Market.updateDetails(itemId, descriptions, purchaseStats, saleStats)
|
|
|
|
print('')
|
|
print('[onMarketDetail]')
|
|
print('itemId: '..itemId)
|
|
print('descriptions:')
|
|
for k, desc in pairs(descriptions) do
|
|
print(' type: '..desc[1]..' | description: '..desc[2])
|
|
end
|
|
print('purchaseStats:')
|
|
for k, stat in pairs(purchaseStats) do
|
|
print(' transactions: '..stat[1])
|
|
print(' total price: '..stat[2])
|
|
print(' highest price: '..stat[3])
|
|
print(' lowest price: '..stat[4])
|
|
end
|
|
print('saleStats:')
|
|
for k, stat in pairs(saleStats) do
|
|
print(' transactions: '..stat[1])
|
|
print(' total price: '..stat[2])
|
|
print(' highest price: '..stat[3])
|
|
print(' lowest price: '..stat[4])
|
|
end
|
|
end
|
|
|
|
function Market.onMarketBrowse(offers)
|
|
Market.updateOffers(offers)
|
|
end
|
|
|
|
function Market.onItemBoxChecked(widget)
|
|
if widget:isChecked() then
|
|
Market.updateSelectedItem(widget.item)
|
|
end
|
|
end
|