local Public = {} local Constants = require 'maps.cave_miner_v2.constants' local Functions = require 'maps.cave_miner_v2.functions' local LootRaffle = require "functions.loot_raffle" local math_floor = math.floor local math_random = math.random local function get_item_blacklist(tier) local blacklist = LootRaffle.get_tech_blacklist(tier * 0.05) blacklist["discharge-defense-remote"] = true blacklist["express-loader"] = true blacklist["fast-loader"] = true blacklist["landfill"] = true blacklist["loader"] = true blacklist["railgun"] = true blacklist["railgun-dart"] = true blacklist["raw-fish"] = true blacklist["wood"] = true return blacklist end local special_slots = { [1] = function(market, cave_miner) local pickaxe_tiers = Constants.pickaxe_tiers local tier = cave_miner.pickaxe_tier + 1 if pickaxe_tiers[tier] then local item_stacks = LootRaffle.roll(math.floor(tier ^ 3.65) + 8, 100, get_item_blacklist(tier)) local price = {} for _, item_stack in pairs(item_stacks) do table.insert(price, {name = item_stack.name, amount = item_stack.count}) end market.add_market_item({price = price, offer = {type = 'nothing', effect_description = 'Upgrade pickaxe to tier ' .. tier .. ': ' .. pickaxe_tiers[tier]}}) else market.add_market_item({price = price, offer = {type = 'nothing', effect_description = 'Maximum pickaxe upgrade reached!'}}) end end, [2] = function(market, cave_miner) local tier = (market.force.character_inventory_slots_bonus + 2) * 0.5 local item_stacks = LootRaffle.roll(math.floor(tier ^ 3.50) + 8, 100, get_item_blacklist(tier)) local price = {} for _, item_stack in pairs(item_stacks) do table.insert(price, {name = item_stack.name, amount = item_stack.count}) end market.add_market_item({price = price, offer = {type = 'nothing', effect_description = 'Upgrade backpack to tier ' .. tier}}) return tier end, [3] = function(market, cave_miner) local tier_pickaxe = cave_miner.pickaxe_tier + 1 local tier_backpack = (market.force.character_inventory_slots_bonus + 2) * 0.5 market.add_market_item({price = {{name = "raw-fish", amount = (tier_pickaxe + tier_backpack)}}, offer = {type = 'nothing', effect_description = 'Reroll offers'}}) end, } function Public.refresh_offer(market, cave_miner, slot) local offers = market.get_market_items() market.clear_market_items() for k, offer in pairs(offers) do if k == slot then special_slots[k](market, cave_miner) else market.add_market_item(offer) end end end function Public.spawn(cave_miner) local surface = game.surfaces.nauvis local market = surface.create_entity({name = "market", position = {0,0}, force = "player"}) rendering.draw_light({ sprite = "utility/light_medium", scale = 7, intensity = 0.8, minimum_darkness = 0, oriented = true, color = {255,255,255}, target = market, surface = surface, visible = true, only_in_alt_mode = false, }) market.destructible = false market.minable = false for i = 1, 3, 1 do special_slots[i](market, cave_miner) end for _, item in pairs(Constants.spawn_market_items) do market.add_market_item(item) end end function Public.offer_bought(event, cave_miner) local player = game.players[event.player_index] local market = event.market local offer_index = event.offer_index local count = event.count local offers = market.get_market_items() local bought_offer = offers[offer_index].offer if bought_offer.type ~= "nothing" then return end if offer_index == 1 then market.force.play_sound({path = 'utility/new_objective', volume_modifier = 0.75}) cave_miner.pickaxe_tier = cave_miner.pickaxe_tier + 1 local speed = Functions.set_mining_speed(cave_miner, player.force) game.print("Pickaxe has been upgraded to: " .. Constants.pickaxe_tiers[cave_miner.pickaxe_tier] .. "!") Public.refresh_offer(market, cave_miner, 1) Public.refresh_offer(market, cave_miner, 3) Functions.update_top_gui(cave_miner) return end if offer_index == 2 then market.force.character_inventory_slots_bonus = market.force.character_inventory_slots_bonus + 2 market.force.play_sound({path = 'utility/new_objective', volume_modifier = 0.75}) game.print("Backpack has been upgraded to tier " .. (market.force.character_inventory_slots_bonus + 2) * 0.5 .. "!") Public.refresh_offer(market, cave_miner, 2) Public.refresh_offer(market, cave_miner, 3) Functions.update_top_gui(cave_miner, 2) return end if offer_index == 3 then if cave_miner.last_reroll_player_name ~= player.name then game.print(player.name .. " is rerolling market offers.") cave_miner.last_reroll_player_name = player.name end Public.refresh_offer(market, cave_miner, 1) Public.refresh_offer(market, cave_miner, 2) Public.refresh_offer(market, cave_miner, 3) end end function Public.spawn_random_cave_market(surface, position) local r = 64 if surface.count_entities_filtered({name = "market", area = {{position.x - r, position.y - r}, {position.x + r, position.y + r}}}) > 0 then return end local difficulty_modifier = Functions.get_difficulty_modifier(position) local market = surface.create_entity({name = "market", position = position, force = "player"}) local worth = math_floor(difficulty_modifier * 10000) + 256 local blacklist = LootRaffle.get_tech_blacklist(difficulty_modifier + 0.20) blacklist["discharge-defense-remote"] = true blacklist["landfill"] = true blacklist["copper-cable"] = true blacklist["iron-stick"] = true blacklist["raw-fish"] = true local items = {} for _ = 1, 2, 1 do local item_sells = LootRaffle.roll(worth, 3, blacklist) for _, item_stack in pairs(item_sells) do items[item_stack.name] = LootRaffle.get_item_value(item_stack.name) end end for name, value in pairs(items) do local value = value * math_random(16, 32) * 0.01 local count = 1 if value < 1 then count = math_floor(1 / value) value = 1 end value = math_floor(value) market.add_market_item({price = {{"raw-fish", value}}, offer = {type = 'give-item', item = name, count = count}}) end blacklist["railgun"] = true blacklist["railgun-dart"] = true blacklist["wood"] = true blacklist["express-loader"] = true blacklist["fast-loader"] = true blacklist["loader"] = true local items = {} for _ = 1, 2, 1 do local item_buys = LootRaffle.roll(worth, 3, blacklist) for _, item_stack in pairs(item_buys) do items[item_stack.name] = LootRaffle.get_item_value(item_stack.name) end end for name, value in pairs(items) do local value = value * math_random(5, 10) * 0.01 local count = 1 if value < 1 then count = math_floor(1 / value) value = 1 end value = math_floor(value) market.add_market_item({price = {{name, count}}, offer = {type = 'give-item', item = "raw-fish", count = value}}) end rendering.draw_light({ sprite = "utility/light_medium", scale = 3, intensity = 0.8, minimum_darkness = 0, oriented = true, color = {255,255,255}, target = market, surface = surface, visible = true, only_in_alt_mode = false, }) market.destructible = false market.minable = false end return Public