2015-09-02 06:38:22 +03:00

524 lines
17 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local event = require("event")
local c = require("component")
local unicode = require("unicode")
local sides = require("sides")
local gpu = c.gpu
local inv = c.inventory_controller
local chestSide = sides.up
--------------------------------------------------------------------------------------------------------
local currentMode = 3
local xSize, ySize = gpu.getResolution()
local rarityColors = {
["Common"] = 0xB0C3D9,
["Uncommon"] = 0x5E98D9,
["Rare"] = 0x4B69FF,
["Mythical"] = 0x8847FF,
["Legendary"] = 0xD32CE6,
["Immortal"] = 0xE4AE33,
["Arcana"] = 0xADE55C,
["Ancient"] = 0xEB4B4B
}
local colors = {
["background"] = 0x262626,
["topbar"] = 0xffffff,
["topbarText"] = 0x444444,
["topbarButton"] = ecs.colors.blue,
["topbarButtonText"] = 0xffffff,
["inventoryBorder"] = 0xffffff,
["inventoryBorderSelect"] = ecs.colors.blue,
["inventoryBorderSelectText"] = 0xffffff,
["inventoryText"] = 0x262626,
["inventoryTextDarker"] = 0x666666,
["sellButtonColor"] = ecs.colors.blue,
["sellButtonTextColor"] = 0xffffff,
}
local moneySymbol = ""
local adminSellMultiplyer = 0.5
local widthOfOneItemElement = 12
local heightOfOneItemElement = widthOfOneItemElement / 2
--------------------------------------------------------------------------------------------------------
local adminShop = {
["minecraft:stone"] = {
["data"] = 0,
["price"] = 4,
["rarity"] = "Uncommon",
},
["minecraft:diamond"] = {
["data"] = 0,
["price"] = 200,
["rarity"] = "Legendary",
},
["minecraft:grass"] = {
["data"] = 0,
["price"] = 4,
["rarity"] = "Uncommon",
},
["minecraft:cobblestone"] = {
["data"] = 0,
["price"] = 2,
["rarity"] = "Common",
},
["minecraft:dirt"] = {
["data"] = 0,
["price"] = 2,
["rarity"] = "Common",
},
["minecraft:iron_ore"] = {
["data"] = 0,
["price"] = 20,
["rarity"] = "Rare",
},
["minecraft:gold_ore"] = {
["data"] = 0,
["price"] = 40,
["rarity"] = "Mythical",
},
["minecraft:coal_ore"] = {
["data"] = 0,
["price"] = 5,
["rarity"] = "Uncommon",
},
["minecraft:wool"] = {
["data"] = 0,
["price"] = 10,
["rarity"] = "Uncommon",
},
["minecraft:redstone"] = {
["data"] = 0,
["price"] = 10,
["rarity"] = "Rare",
},
["minecraft:log"] = {
["data"] = 0,
["price"] = 3,
["rarity"] = "Common",
},
["IC2:itemOreIridium"] = {
["data"] = 0,
["price"] = 50000,
["rarity"] = "Arcana",
},
}
local massivWithProfile = {
["name"] = "IT",
["money"] = 1000000,
["inventory"] = {
{
["id"] = "minecraft:stone",
["label"] = "Stone",
["data"] = 0,
["count"] = 64,
},
{
["id"] = "minecraft:grass",
["data"] = 0,
["label"] = "Grass",
["count"] = 32,
},
{
["id"] = "minecraft:wool",
["data"] = 0,
["label"] = "Red wool",
["count"] = 12,
},
{
["id"] = "minecraft:diamond",
["data"] = 0,
["label"] = "Diamond",
["count"] = 999,
},
{
["id"] = "minecraft:cobblestone",
["data"] = 0,
["label"] = "Cobblestone",
["count"] = 47000,
},
{
["id"] = "minecraft:redstone",
["data"] = 0,
["label"] = "Redstone",
["count"] = 12000,
},
{
["id"] = "minecraft:iron_ore",
["data"] = 0,
["label"] = "Iron ore",
["count"] = 572,
},
{
["id"] = "minecraft:gold_ore",
["data"] = 0,
["label"] = "Gold ore",
["count"] = 246,
},
{
["id"] = "minecraft:coal_ore",
["data"] = 0,
["label"] = "Coal ore",
["count"] = 11,
},
{
["id"] = "IC2:itemOreIridium",
["data"] = 0,
["label"] = "Iridium Ore",
["count"] = 5,
},
{
["id"] = "minecraft:log",
["data"] = 0,
["label"] = "Log",
["count"] = 124782,
},
},
}
--Обжекты
local obj = {}
local function newObj(class, name, ...)
obj[class] = obj[class] or {}
obj[class][name] = {...}
end
--Сконвертировать кол-во предметов в более компактный вариант
local function prettyItemCount(count)
if count >= 1000 then
return tostring(math.floor(count / 1000)) .. "K"
end
return tostring(count)
end
--Добавление предмета в инвентарь
local function addItemToInventory(id, data, label, count)
--Переменная успеха, означающая, что такой предмет уже есть,
--и что его количество успешно увеличилось
local success = false
--Перебираем весь массив инвентаря и смотрим, есть ли чет такое
for i = 1, #massivWithProfile.inventory do
if id == massivWithProfile.inventory[i].id then
if data == massivWithProfile.inventory[i].data then
massivWithProfile.inventory[i].count = massivWithProfile.inventory[i].count + count
success = true
break
end
end
end
--Если такого предмета нет, то создать новый слот в инвентаре
if not success then
table.insert(massivWithProfile.inventory, { ["id"] = id, ["data"] = data, ["label"] = label, ["count"] = count } )
end
end
--Удалить кол-во предмета из инвентаря
local function removeItemFromInventory(numberOfItemInInventory, count)
local skokaMozhnaUdalit = massivWithProfile.inventory[numberOfItemInInventory].count
if count > skokaMozhnaUdalit then count = skokaMozhnaUdalit end
massivWithProfile.inventory[numberOfItemInInventory].count = massivWithProfile.inventory[numberOfItemInInventory].count - count
if massivWithProfile.inventory[numberOfItemInInventory].count == 0 then
table.remove(massivWithProfile.inventory, numberOfItemInInventory)
end
end
--Просканировать сундук и добавить в него шмот
local function addToInventoryFromChest()
local counter = 0
local inventorySize = inv.getInventorySize(chestSide)
for i = 1, inventorySize do
local stack = inv.getStackInSlot(chestSide, i)
if stack then
addItemToInventory(stack.name, stack.damage, stack.label, stack.size)
counter = counter + stack.size
end
end
return counter
end
--Продать шмотку одменам
local function sellToAdmins(numberOfItemInInventory, skoka)
local item = massivWithProfile.inventory[numberOfItemInInventory]
if adminShop[item.id] then
local price = math.floor(adminShop[item.id].price * adminSellMultiplyer)
removeItemFromInventory(numberOfItemInInventory, skoka)
massivWithProfile.money = massivWithProfile.money + price * skoka
return (price * skoka)
end
return 0
end
--Нарисовать конкретный айтем
local function drawItem(xPos, yPos, back, fore, text1, text2)
--Рисуем квадратик
ecs.square(xPos, yPos, widthOfOneItemElement, heightOfOneItemElement, back)
--Рисуем текст в рамке
text1 = ecs.stringLimit("end", text1, widthOfOneItemElement - 2)
text2 = ecs.stringLimit("end", prettyItemCount(text2), widthOfOneItemElement - 2)
local x
x = xPos + math.floor(widthOfOneItemElement / 2 - unicode.len(text1) / 2)
ecs.colorText(x, yPos + 2, fore, text1)
x = xPos + math.floor(widthOfOneItemElement / 2 - unicode.len(text2) / 2)
ecs.colorText(x, yPos + 3, fore, text2)
x = nil
end
--Показ инвентаря
local function showInventory(x, y, massivOfInventory, page, currentItem)
obj["SellItems"] = nil
obj["SellButtons"] = nil
local widthOfItemInfoPanel = 26
local width = math.floor((xSize - widthOfItemInfoPanel - 4) / (widthOfOneItemElement))
local height = math.floor((ySize - 8) / (heightOfOneItemElement))
local countOfItems = #massivOfInventory.inventory
local countOfPages = math.ceil(countOfItems / (width * height))
local widthOfAllElements = width * widthOfOneItemElement
local heightOfAllElements = height * heightOfOneItemElement
currentItem = currentItem or 1
--Очищаем фоном
ecs.square(x, y, widthOfAllElements, heightOfAllElements, colors.background)
--Рисуем айтемы
local textColor, borderColor, itemCounter, xPos, yPos = nil, nil, 1 + page * width * height - width * height, x, y
for j = 1, height do
xPos = x
for i = 1, width do
--Если такой предмет вообще существует
if massivOfInventory.inventory[itemCounter] then
--Делаем цвет рамки
if itemCounter == currentItem then
borderColor = colors.inventoryBorderSelect
textColor = colors.inventoryBorderSelectText
else
local cyka = false
if j % 2 == 0 then
if i % 2 ~= 0 then
cyka = true
end
else
if i % 2 == 0 then
cyka = true
end
end
if cyka then
borderColor = colors.inventoryBorder
else
borderColor = colors.inventoryBorder - 0x111111
end
textColor = colors.inventoryText
end
--Рисуем итем
drawItem(xPos, yPos, borderColor, textColor, massivOfInventory.inventory[itemCounter].label, massivOfInventory.inventory[itemCounter].count)
newObj("SellItems", itemCounter, xPos, yPos, xPos + widthOfOneItemElement - 1, yPos + heightOfOneItemElement - 1)
else
break
end
itemCounter = itemCounter + 1
xPos = xPos + widthOfOneItemElement
end
yPos = yPos + heightOfOneItemElement
end
--Рисуем инфу о кнкретном айтеме
xPos = x + widthOfAllElements + 2
yPos = y
widthOfItemInfoPanel = xSize - xPos - 1
--Рамку рисуем
ecs.square(xPos, yPos, widthOfItemInfoPanel, ySize - 5, colors.inventoryBorder)
yPos = yPos + 1
xPos = xPos + 2
--Инфа о блоке
local currentRarity = adminShop[massivOfInventory.inventory[currentItem].id]
if not currentRarity then currentRarity = "Common" else currentRarity = currentRarity.rarity end
ecs.colorText(xPos, yPos, colors.inventoryText, massivOfInventory.inventory[currentItem].label); yPos = yPos + 1
ecs.colorText(xPos, yPos, rarityColors[currentRarity], currentRarity); yPos = yPos + 1
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, massivOfInventory.inventory[currentItem].id); yPos = yPos + 1
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "Цвет: " .. massivOfInventory.inventory[currentItem].data); yPos = yPos + 1
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "Количество: " .. massivOfInventory.inventory[currentItem].count); yPos = yPos + 1
--Твой бабос
yPos = yPos + 1
ecs.colorText(xPos, yPos, colors.inventoryText, "Твой капитал:"); yPos = yPos + 1
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, massivOfInventory.money .. moneySymbol); yPos = yPos + 1
--Цена админов
yPos = yPos + 1
local adminPrice = adminShop[massivOfInventory.inventory[currentItem].id]
if adminPrice then adminPrice = math.floor(adminPrice.price * adminSellMultiplyer) .. moneySymbol else adminPrice = "Отсутствует" end
ecs.colorText(xPos, yPos, colors.inventoryText, "Цена у админов:"); yPos = yPos + 1
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, adminPrice)
--Цена на ТП
yPos = yPos + 2
ecs.colorText(xPos, yPos, colors.inventoryText, "Цена на Торговой Площадке:"); yPos = yPos + 1
ecs.colorText(xPos, yPos, colors.inventoryTextDarker, "От 130.27"..moneySymbol); yPos = yPos + 1
--Кнопы
xPos = xPos - 2
yPos = ySize - 3
local x1, y1, x2, y2, name
name = "Продать игрокам"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, widthOfItemInfoPanel, 3, name, colors.sellButtonColor, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, widthOfItemInfoPanel); yPos = yPos - 3
if adminPrice ~= "Отсутствует" then
name = "Продать админам"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, widthOfItemInfoPanel, 3, name, 0x66b6ff, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, widthOfItemInfoPanel); yPos = yPos - 3
end
name = "Пополнить инвентарь"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, widthOfItemInfoPanel, 3, name, 0x99dbff, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, widthOfItemInfoPanel); yPos = yPos - 3
--Перелистывалки
local stro4ka = tostring(page) .. " из " .. tostring(countOfPages)
local sStro4ka = unicode.len(stro4ka) + 2
xPos = xPos - sStro4ka - 16
yPos = ySize - 3
name = "<"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, 7, 3, name, colors.sellButtonColor, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, 7); xPos = xPos + 7
ecs.square(xPos, yPos, sStro4ka, 3, colors.inventoryBorder)
ecs.colorText(xPos + 1, yPos + 1, 0x000000, stro4ka); xPos = xPos + sStro4ka
name = ">"; x1, y1, x2, y2 = ecs.drawButton(xPos, yPos, 7, 3, name, colors.sellButtonColor, colors.sellButtonTextColor); newObj("SellButtons", name, x1, y1, x2, y2, 7)
return countOfPages
end
local function sell()
--Показываем инвентарь
local xInventory, yInventory, currentPage, currentItem = 3, 5, 1, 1
local countOfPages = showInventory(xInventory, yInventory, massivWithProfile, currentPage, currentItem)
ecs.error("Программа разрабатывается. По сути это будет некий аналог Торговой Площадки Стима с разными доп. фичами.")
while true do
local e = {event.pull()}
if e[1] == "touch" then
for key in pairs(obj["SellItems"])do
if ecs.clickedAtArea(e[3], e[4], obj["SellItems"][key][1], obj["SellItems"][key][2], obj["SellItems"][key][3], obj["SellItems"][key][4]) then
currentItem = key
showInventory(xInventory, yInventory, massivWithProfile, currentPage, currentItem)
break
end
end
for key in pairs(obj["SellButtons"])do
if ecs.clickedAtArea(e[3], e[4], obj["SellButtons"][key][1], obj["SellButtons"][key][2], obj["SellButtons"][key][3], obj["SellButtons"][key][4]) then
ecs.drawButton(obj["SellButtons"][key][1], obj["SellButtons"][key][2], obj["SellButtons"][key][5], 3, key, ecs.colors.green, 0xffffff)
os.sleep(0.3)
if key == ">" then
if currentPage < countOfPages then currentPage = currentPage + 1 end
elseif key == "<" then
if currentPage > 1 then currentPage = currentPage - 1 end
elseif key == "Пополнить инвентарь" then
ecs.error("Пихай предметы в сундук и жми ок, епта!")
local addedCount = addToInventoryFromChest()
ecs.error("Добавлено "..addedCount.." предметов.")
elseif key == "Продать админам" then
local maxToSell = massivWithProfile.inventory[currentItem].count
local data = ecs.universalWindow("auto", "auto", 40, 0x444444, true, {"EmptyLine"}, {"CenterText", 0xffffff, "Сколько продаем?"}, {"EmptyLine"}, {"Slider", 0xffffff, 0x33db80, 1, maxToSell, math.floor(maxToSell / 2), "Количество: "}, {"EmptyLine"}, {"Button", 0x33db80, 0xffffff, "Продать"})
local count = data[1] or nil
if count then
local money = sellToAdmins(currentItem, count)
ecs.universalWindow("auto", "auto", 40, 0x444444, true, {"EmptyLine"}, {"CenterText", 0xffffff, "Успешно продано!"}, {"CenterText", 0xffffff, "Ты заработал "..money..moneySymbol}, {"EmptyLine"}, {"Button", 0x33db80, 0xffffff, "Ok"})
else
ecs.error("Ошибка при продаже! Дебажь!")
end
end
countOfPages = showInventory(xInventory, yInventory, massivWithProfile, currentPage, currentItem)
break
end
end
end
end
end
local function main()
--Кнопы
local topButtons = {{"🏠", "Главная"}, {"", "Купить"}, {"", "Продать"}, {"", "Лотерея"},{"", "Мой профиль"}}
--Расстояние между кнопами
local spaceBetweenTopButtons = 2
--Считаем ширину
local widthOfTopButtons = 0
for i = 1, #topButtons do
topButtons[i][3] = unicode.len(topButtons[i][2]) + 2
widthOfTopButtons = widthOfTopButtons + topButtons[i][3] + spaceBetweenTopButtons
end
--Считаем коорду старта кноп
local xStartOfTopButtons = math.floor(xSize / 2 - widthOfTopButtons / 2)
--Рисуем топбар
ecs.square(1, 1, xSize, 3, colors.topbar)
--Рисуем белую подложку
ecs.square(1, 4, xSize, ySize - 3, colors.background)
--Отрисовка одной кнопки
local function drawButton(i, x)
local back, fore
if i == currentMode then
back = colors.topbarButton
fore = colors.topbarButtonText
else
back = colors.topbar
fore = colors.topbarText
end
ecs.drawButton(x, 1, topButtons[i][3], 2, topButtons[i][1], back, fore)
ecs.drawButton(x, 3, topButtons[i][3], 1, topButtons[i][2], back, fore)
end
--Рисуем топ кнопочки
for i = 1, #topButtons do
drawButton(i, xStartOfTopButtons)
xStartOfTopButtons = xStartOfTopButtons + topButtons[i][3] + spaceBetweenTopButtons
end
--Запускаем нужный режим работы проги
if currentMode == 3 then
sell()
end
end
main()