1
0
mirror of https://github.com/AR2000AR/openComputers_codes.git synced 2025-09-07 22:21:14 +02:00
Files
openComputers_codes/libCoin/lib/libCoin.lua
2023-02-21 17:12:10 +01:00

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