mirror of
https://github.com/AR2000AR/openComputers_codes.git
synced 2025-09-07 22:21:14 +02:00
166 lines
5.5 KiB
Lua
166 lines
5.5 KiB
Lua
local transposer = require("component").transposer
|
|
assert(transposer, "This library require a transposer")
|
|
|
|
local CONVERTION_RATE = 100
|
|
local COIN_BRONZE = 1
|
|
local ID_COIN_BRONZE = "ordinarycoins:coinbronze"
|
|
local COIN_SILVER = COIN_BRONZE * CONVERTION_RATE
|
|
local ID_COIN_SILVER = "ordinarycoins:coinsilver"
|
|
local COIN_GOLD = COIN_SILVER * CONVERTION_RATE
|
|
local ID_COIN_GOLD = "ordinarycoins:coingold"
|
|
local COIN_PLATINUM = COIN_GOLD * CONVERTION_RATE
|
|
local ID_COIN_PLATINUM = "ordinarycoins:coinplatinum"
|
|
|
|
local coin = {}
|
|
|
|
---count the coins
|
|
---@param side side
|
|
---@return number
|
|
---@return number
|
|
---@return number
|
|
---@return number
|
|
function coin.getCoin(side)
|
|
local bronze, silver, gold, platinum = 0, 0, 0, 0
|
|
local stack = nil
|
|
for stack in transposer.getAllStacks(side) do
|
|
if (stack) then
|
|
if (stack.name == ID_COIN_BRONZE) then bronze = bronze + stack.size end
|
|
if (stack.name == ID_COIN_SILVER) then silver = silver + stack.size end
|
|
if (stack.name == ID_COIN_GOLD) then gold = gold + stack.size end
|
|
if (stack.name == ID_COIN_PLATINUM) then platinum = platinum + stack.size end
|
|
end
|
|
end
|
|
return math.floor(bronze), math.floor(silver), math.floor(gold), math.floor(platinum)
|
|
end
|
|
|
|
---get the total value of coins
|
|
---@param bronze number
|
|
---@param silver number
|
|
---@param gold number
|
|
---@param platinum number
|
|
---@return number
|
|
function coin.getValue(bronze, silver, gold, platinum)
|
|
bronze = bronze or 0
|
|
silver = silver or 0
|
|
gold = gold or 0
|
|
platinum = platinum or 0
|
|
return (bronze * COIN_BRONZE) + (silver * COIN_SILVER) + (gold * COIN_GOLD) + (platinum * COIN_PLATINUM)
|
|
end
|
|
|
|
---find how much space is left for each kind of coins
|
|
---@param side side
|
|
---@return number
|
|
---@return number
|
|
---@return number
|
|
---@return number
|
|
---@return number
|
|
function coin.getEmptySpace(side)
|
|
local bronze, silver, gold, platinum, air = 0, 0, 0, 0, 0
|
|
local stack = nil
|
|
for stack in transposer.getAllStacks(side) do
|
|
if (stack.name) then
|
|
if (stack.size < stack.maxSize) then
|
|
if (stack.name == ID_COIN_BRONZE) then bronze = bronze + stack.maxSize - stack.size end
|
|
if (stack.name == ID_COIN_SILVER) then silver = silver + stack.maxSize - stack.size end
|
|
if (stack.name == ID_COIN_GOLD) then gold = gold + stack.maxSize - stack.size end
|
|
if (stack.name == ID_COIN_PLATINUM) then platinum = platinum + stack.maxSize - stack.size end
|
|
if (stack.name == "minecraft:air") then air = air + 1 end
|
|
end
|
|
else
|
|
air = air + 1
|
|
end
|
|
end
|
|
return math.floor(bronze), math.floor(silver), math.floor(gold), math.floor(platinum), air
|
|
end
|
|
|
|
---find the first stack containing the item
|
|
---@param side side
|
|
---@param name string
|
|
---@return number|boolean
|
|
function coin.findFirstStack(side, name)
|
|
local i = 1
|
|
for stack in transposer.getAllStacks(side) do
|
|
if (stack.name and (name == nil or stack.name == name)) then return i end
|
|
i = i + 1
|
|
end
|
|
return false
|
|
end
|
|
|
|
---move a certain value of coins
|
|
---@param amount number
|
|
---@param from side
|
|
---@param to side
|
|
---@return number|boolean
|
|
---@return number|nil
|
|
---@return number|nil
|
|
---@return number|nil
|
|
function coin.moveCoin(amount, from, to)
|
|
if (coin.getValue(coin.getCoin(from)) >= amount) then
|
|
local bronze, silver, gold, platinum = coin.getCoin(from)
|
|
|
|
local need_platinum = math.floor((amount) / COIN_PLATINUM)
|
|
amount = amount - (need_platinum * COIN_PLATINUM)
|
|
local need_gold = math.floor((amount) / COIN_GOLD)
|
|
amount = amount - (need_gold * COIN_GOLD)
|
|
local need_silver = math.floor((amount) / COIN_SILVER)
|
|
amount = amount - (need_silver * COIN_SILVER)
|
|
local need_bronze = math.floor((amount) / COIN_BRONZE)
|
|
|
|
if (need_platinum > platinum) then
|
|
need_gold = need_gold + ((need_platinum - platinum) * CONVERTION_RATE)
|
|
need_platinum = platinum
|
|
end
|
|
if (need_gold > gold) then
|
|
need_silver = need_silver + ((need_gold - gold) * CONVERTION_RATE)
|
|
need_gold = gold
|
|
end
|
|
if (need_silver > silver) then
|
|
need_bronze = need_bronze + ((need_silver - silver) * CONVERTION_RATE)
|
|
need_silver = silver
|
|
end
|
|
if (need_bronze > bronze) then
|
|
need_bronze = bronze
|
|
end
|
|
|
|
local moved_bronze, moved_silver, moved_gold, moved_platinum = 0, 0, 0, 0
|
|
while (moved_bronze < need_bronze) do
|
|
local moved_coin = transposer.transferItem(from, to, need_bronze, coin.findFirstStack(from, ID_COIN_BRONZE) --[[@as number]])
|
|
if (moved_coin == 0) then
|
|
break
|
|
else
|
|
moved_bronze = moved_bronze + moved_coin
|
|
end
|
|
end
|
|
while (moved_silver < need_silver) do
|
|
local moved_coin = transposer.transferItem(from, to, need_silver, coin.findFirstStack(from, ID_COIN_SILVER) --[[@as number]])
|
|
if (moved_coin == 0) then
|
|
break
|
|
else
|
|
moved_silver = moved_silver + moved_coin
|
|
end
|
|
end
|
|
while (moved_gold < need_gold) do
|
|
local moved_coin = transposer.transferItem(from, to, need_gold, coin.findFirstStack(from, ID_COIN_GOLD) --[[@as number]])
|
|
if (moved_coin == 0) then
|
|
break
|
|
else
|
|
moved_gold = moved_gold + moved_coin
|
|
end
|
|
end
|
|
while (moved_platinum < need_platinum) do
|
|
local moved_coin = transposer.transferItem(from, to, need_platinum, coin.findFirstStack(from, ID_COIN_PLATINUM) --[[@as number]])
|
|
if (moved_coin == 0) then
|
|
break
|
|
else
|
|
moved_platinum = moved_platinum + moved_coin
|
|
end
|
|
end
|
|
|
|
return moved_bronze, moved_silver, moved_gold, moved_platinum
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
return coin
|