1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-06 00:23:49 +02:00
ComfyFactorio/modules/shopping_chests.lua
2021-03-24 20:14:55 +01:00

184 lines
6.1 KiB
Lua

local Public = {}
local shop_list = {
['coal'] = 1,
['copper-ore'] = 1,
['crude-oil-barrel'] = 7.5,
['empty-barrel'] = 5,
['iron-ore'] = 1,
['landfill'] = 2,
['raw-fish'] = 4.25,
['stone'] = 1,
['uranium-ore'] = 3,
['wood'] = 0.75
}
function Public.create_shopping_chest(surface, position, destructible)
local entity = surface.create_entity({name = 'logistic-chest-requester', position = position, force = 'shopping_chests'})
entity.minable = false
if not destructible then
entity.destructible = false
end
end
function Public.create_dump_chest(surface, position, destructible)
local entity = surface.create_entity({name = 'logistic-chest-passive-provider', position = position, force = 'shopping_chests'})
entity.minable = false
if not destructible then
entity.destructible = false
end
end
local function get_affordable_item_count(name, count)
if global.credits >= count * shop_list[name] then
return count
end
count = math.floor(global.credits / shop_list[name])
return count
end
local function process_shopping_chest(k, chest)
if not chest.valid then
global.shopping_chests[k] = nil
return
end
if global.credits <= 0 then
return
end
local requested_item_stack = chest.get_request_slot(1)
if not requested_item_stack then
return
end
if not shop_list[requested_item_stack.name] then
chest.surface.create_entity(
{name = 'flying-text', position = {chest.position.x - 2, chest.position.y}, text = requested_item_stack.name .. ' is not for sale', color = {r = 200, g = 160, b = 30}}
)
return
end
local inventory = chest.get_inventory(defines.inventory.chest)
--if not inventory.can_insert(requested_item_stack) then return end
local current_count = inventory.get_item_count(requested_item_stack.name)
if current_count >= requested_item_stack.count then
return
end
local count = requested_item_stack.count - current_count
count = get_affordable_item_count(requested_item_stack.name, count)
if count < 1 then
return
end
local inserted_amount = inventory.insert({name = requested_item_stack.name, count = count})
if inserted_amount == 0 then
return
end
local spent_credits = inserted_amount * shop_list[requested_item_stack.name]
global.credits = global.credits - spent_credits
chest.surface.create_entity({name = 'flying-text', position = chest.position, text = '-' .. spent_credits .. ' ø', color = {r = 200, g = 160, b = 30}})
end
local function process_dump_chest(key, chest)
if not chest.valid then
global.dump_chests[key] = nil
return
end
local inventory = chest.get_inventory(defines.inventory.chest)
if inventory.is_empty() then
return
end
for k, _ in pairs(shop_list) do
local removed = inventory.remove(k)
if removed > 0 then
local gain = removed * shop_list[k]
global.credits = global.credits + gain
chest.surface.create_entity({name = 'flying-text', position = chest.position, text = '+' .. gain .. ' ø', color = {r = 200, g = 160, b = 30}})
return
end
end
end
local function gui()
local tooltip = 'Trade goods: '
for k, v in pairs(shop_list) do
tooltip = tooltip .. k
tooltip = tooltip .. ' '
tooltip = tooltip .. v
tooltip = tooltip .. ' | '
end
for _, player in pairs(game.connected_players) do
if player.gui.top.credits_button then
player.gui.top.credits_button.destroy()
end
local frame = player.gui.top.add({type = 'frame', name = 'credits_button'})
frame.style.maximal_height = 38
frame.style.top_padding = 0
frame.style.left_padding = 0
local element = frame.add({type = 'label', name = 'credits', caption = global.credits .. ' ø', tooltip = tooltip})
local style = element.style
style.minimal_height = 38
style.maximal_height = 38
style.minimal_width = 100
style.horizontal_align = 'right'
style.top_padding = 2
style.left_padding = 2
style.right_padding = 2
style.bottom_padding = 2
style.font_color = {r = 255, g = 215, b = 0}
style.font = 'default-large-bold'
end
end
local function on_gui_opened(event)
if not event.entity then
return
end
if event.entity.force.name ~= 'shopping_chests' then
return
end
local index = event.entity.position.x .. '_'
index = index .. event.entity.position.y
if global.registerd_shopping_chests[index] then
return
end
if event.entity.name == 'logistic-chest-passive-provider' then
global.dump_chests[#global.dump_chests + 1] = event.entity
global.registerd_shopping_chests[index] = true
event.entity.surface.create_entity({name = 'flying-text', position = event.entity.position, text = 'Chest registered, shop active!', color = {r = 200, g = 160, b = 30}})
return
end
if event.entity.name == 'logistic-chest-requester' then
global.shopping_chests[#global.shopping_chests + 1] = event.entity
global.registerd_shopping_chests[index] = true
event.entity.surface.create_entity({name = 'flying-text', position = event.entity.position, text = 'Chest registered, shop active!', color = {r = 200, g = 160, b = 30}})
return
end
end
local function tick()
for k, chest in pairs(global.shopping_chests) do
process_shopping_chest(k, chest)
end
for k, chest in pairs(global.dump_chests) do
process_dump_chest(k, chest)
end
gui()
end
local function on_init()
global.shopping_chests = {}
global.dump_chests = {}
global.registerd_shopping_chests = {}
global.credits = 0
game.create_force('shopping_chests')
game.forces.player.set_friend('shopping_chests', true)
game.forces.shopping_chests.set_friend('player', true)
end
local Event = require 'utils.event'
Event.add(defines.events.on_gui_opened, on_gui_opened)
Event.on_nth_tick(120, tick)
Event.on_init(on_init)
return Public