1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-10 00:43:27 +02:00
ComfyFactorio/maps/pirates/surfaces/cabin.lua
Piratux f539fe2fb5 Hold and power purchase changes
Changes:
- Extra hold and power upgrades now can only be purchased at captain's cabin instead of docks.
2022-10-23 15:16:39 +03:00

378 lines
14 KiB
Lua

-- This file is part of thesixthroc's Pirate Ship softmod, licensed under GPLv3 and stored at https://github.com/danielmartin0/ComfyFactorio-Pirates.
local Memory = require 'maps.pirates.memory'
-- local Math = require 'maps.pirates.math'
-- local Balance = require 'maps.pirates.balance'
local Common = require 'maps.pirates.common'
local CoreData = require 'maps.pirates.coredata'
-- local Utils = require 'maps.pirates.utils_local'
local _inspect = require 'utils.inspect'.inspect
local SurfacesCommon = require 'maps.pirates.surfaces.common'
local Public = {}
local enum = {
DEFAULT = 'Default',
SLOT_EXTRA_HOLD = 5,
SLOT_MORE_POWER = 6,
SLOT_REROLL_PRICES = 7,
}
Public.enum = enum
Public.Data = {}
Public.Data.width = 18
Public.Data.height = 24
Public.Data.cabin_whitebelts_lrtp_order = {
{x = -7.5, y = -10.5, direction = defines.direction.north, type = 'input'},
{x = -6.5, y = -10.5, direction = defines.direction.north, type = 'input'},
{x = -5.5, y = -10.5, direction = defines.direction.north, type = 'input'},
{x = -4.5, y = -10.5, direction = defines.direction.north, type = 'input'},
{x = -7.5, y = 10.5, direction = defines.direction.south, type = 'output'},
{x = -6.5, y = 10.5, direction = defines.direction.south, type = 'output'},
{x = -5.5, y = 10.5, direction = defines.direction.south, type = 'output'},
{x = -4.5, y = 10.5, direction = defines.direction.south, type = 'output'},
}
Public.Data.car_pos = {x = 9, y = 0}
Public.Data.market_position = {x = 3.5, y = -0.5}
Public.Data.static_entities_bp = [[0eNqlmu9u2jAUxd8ln2HK9X/zKlM10RJ1kWiCkrAVVX33hVJtXcuJfcwnhEh+XF+fY8e596W63x+bw9B2U7V5qcZue1hP/fpxaHfn78/VRsKqOlUbZV5XVfvQd2O1+T5f2D522/35kul0aKpN1U7NU7Wquu3T+dvvvt813frhZzNO1fnGbtecWa+r5K3N82FoxnE9HvbtNDXDh9vV692qarqpndrmEsbbl9OP7vh0P1+5kesBrKpDP8439d37mOpv9m1Q8+frOaRPGJWJkWWMzsSoZYzJxOhljM3EmGWMy8TYZYzPxLhlTMjE+GVMzMSEZYzUmZyY4OTqWBJClmwlJ6QsuVqWhJglV82SkLPk6lkSgpZcRUtC0pKraUmIWgK5jCnAiSRHwHJYf1mcp2HbjYd+mNb3zX5hLQKRKaGJJkFUpPUQR5MclLN/Ot8OU7vfN8NpPR2HoVmS6Jy2ebfbtUPzcPnZXUNbVmcoRseCUNI8KTQDOKzwNeBEWl6yTNR1MRGMVfMWUAmiKjYVGrX+Qtz32938E9ynzf/6nV3w/pDXH6fD8fws+PVfTPa/+Bv+xZLGRll2JAfllt4tECiwIDQydrtw4Hm1JjkWcKTYc4ioiolorLrYxYhoiolo1LZ4+0YxumIiitEXr10oxkATbYLI7yruAzG5r1v29ADitEJywJxYxS4sCKRZEBqZIVeWADiW5HjAccXrCSL6YiIaayheT1CMsdhZ/rMP1LU3DHX+8wCg/n0eaDvwOOBYk4D0OvbcAZLqaI8gkGFBaGSsSQS9MXIkKAJOuTdgaOWbRMySciSlHAuk7Nl9A2XDs54AE+XpjQOBsk3hU0OjXQFJtC3AodmzthBwjPc3+ALFVu6LtyiTxvCsMa5g084ItDNAPgLrDDRXQbGTDg5rQbMgcHwMplw9KDZbrh6do57gWPXoEvV4dtJRPgILQnMV6VUMhBRremUFMUWhY0Ik2hvgmBBpb4CDS7zBGyi2G7xhc7wRaW/YAm9E2hsoH7Q30Fzx3rCoilfTKIdQbEVaAiLR7vCIpMtVDaMz5bLOOhRKbVldlxwLpWZf7+KU0BaBE0a/4cUo3iVofMK+5lWw2k2bJCJS+QteHJ0ur1VCpmGrlZDEljVw7lxJxfItsOSrTeFr4zhO2g04eWzFQ6FKu6LNIIgk5cV2yCyvDGImWyjHuaPNAGOiK+MYxdfG4fjY6rjSiBTIxjRMimRvGiTpmmxPwyQhO9QwSZFNapikyT41TDJkqxomsUs+Jjmy7w2TPNtohlGBbX7DqMg2m0FUdlFbko4xwjacYZRim+Awii5AXFB3q0v/7uZDI/Gq+tUM4+WZO4jxUXlrZt3W8/V/ACz9dUA=]]
-- Public.Data.operable_entities_bp = [[0eNqVkeFqwzAMhN9Fv51Ru8nS+lVKGWkjOkMiG0vZGkrefbZXRhljbX+Jg7vPJ/kCh2HCEB0J2AswdaESX52i67M+gzUrBXMa9aLAHT0x2F0yuhN1Q7bIHBAsOMERFFA3ZvXpfY9UHd+RBXKQekwsvai7UTyHiMwVh8GJYLyJm2WvAEmcOPyuUcT8RtN4SE6rfygsiMP1fQXBc8p4uq6kX1+aslSaS670C2MexLT/Y9ZPtmn/xtRPtimYdKhyVnvzvwo+MHJJmI2u261pm1qvm1XyfwG7QKjd]]
Public.Data.cabin_splitters = {
{x = -7, y = 9.5, direction = defines.direction.north, type = 0},
{x = -6, y = 8.5, direction = defines.direction.north, type = 0},
{x = -5, y = 7.5, direction = defines.direction.north, type = 0},
{x = -4, y = 6.5, direction = defines.direction.north, type = 0},
{x = -7, y = 7.5, direction = defines.direction.north, type = 1},
{x = -6, y = 6.5, direction = defines.direction.north, type = 1},
{x = -5, y = 5.5, direction = defines.direction.north, type = 1},
{x = -4, y = 4.5, direction = defines.direction.north, type = 1},
{x = -7, y = 5.5, direction = defines.direction.north, type = 2},
{x = -6, y = 4.5, direction = defines.direction.north, type = 2},
{x = -5, y = 3.5, direction = defines.direction.north, type = 2},
{x = -4, y = 2.5, direction = defines.direction.north, type = 2},
{x = -7, y = 3.5, direction = defines.direction.north, type = 3},
{x = -6, y = 2.5, direction = defines.direction.north, type = 3},
{x = -5, y = 1.5, direction = defines.direction.north, type = 3},
{x = -4, y = 0.5, direction = defines.direction.north, type = 3},
{x = -7, y = 1.5, direction = defines.direction.north, type = 4},
{x = -6, y = 0.5, direction = defines.direction.north, type = 4},
{x = -5, y = -0.5, direction = defines.direction.north, type = 4},
{x = -4, y = -1.5, direction = defines.direction.north, type = 4},
{x = -7, y = -0.5, direction = defines.direction.north, type = 5},
{x = -6, y = -1.5, direction = defines.direction.north, type = 5},
{x = -5, y = -2.5, direction = defines.direction.north, type = 5},
{x = -4, y = -3.5, direction = defines.direction.north, type = 5},
-- {x = -7, y = -2.5, direction = defines.direction.north, type = 6},
-- {x = -6, y = -3.5, direction = defines.direction.north, type = 6},
-- {x = -5, y = -4.5, direction = defines.direction.north, type = 6},
-- {x = -4, y = -5.5, direction = defines.direction.north, type = 6},
{x = -7, y = -2.5, direction = defines.direction.north, type = 7},
{x = -6, y = -3.5, direction = defines.direction.north, type = 7},
{x = -5, y = -4.5, direction = defines.direction.north, type = 7},
{x = -5, y = -7.5, direction = defines.direction.north, type = 7},
{x = -6, y = -8.5, direction = defines.direction.north, type = 7},
{x = -7, y = -9.5, direction = defines.direction.north, type = 7},
{x = -4, y = -6.5, direction = defines.direction.north, type = 8},
{x = -2, y = -6.5, direction = defines.direction.south, type = 9},
}
Public.Data.output_chest = {x = -2.5, y = -9.5}
Public.Data.backup_output_chest = {x = -1.5, y = -9.5}
Public.Data.input_chests = {
{x = -0.5, y = 5.5},
{x = -0.5, y = 3.5},
{x = -0.5, y = 1.5},
{x = -0.5, y = -0.5},
{x = -0.5, y = -2.5},
{x = -0.5, y = -4.5},
-- {x = 0.5, y = -6.5},
}
Public.Data.surfacename_rendering_pos = {x = -0.5, y = -15}
Public.market_price_scale = 300
Public.cabin_shop_data = {
{
price = {{'coin', 400}, {'coal', 10}, {'iron-plate', 20}},--should be inefficient on resources to merely buy arty to shoot nests
offer = {type='give-item', item = 'artillery-shell', count = 5},
},
{
price = {{'coin', 1000}, {'electronic-circuit', 25}},
offer = {type='give-item', item = 'rail-signal', count = 100},
},
{
price = {{'coin', 1000}, {'stone-brick', 50}},
offer = {type='give-item', item = 'uranium-238', count = 10},
},
{
price = {{'coin', 1000}, {'explosives', 5}},
offer = {type='give-item', item = 'cliff-explosives', count = 5},
},
{
price = {}, -- price set later
offer = {type='nothing', effect_description={'pirates.market_description_upgrade_hold'}}
},
{
price = {}, -- price set later
offer = {type='nothing', effect_description={'pirates.market_description_upgrade_power'}}
},
{
price = {{'coin', 100}, {'raw-fish', 1}},
offer = {type='nothing', effect_description={'pirates.market_description_reroll_prices'}}
},
--disabled now that we can wait after any destination:
-- {
-- price = {{'coin', 25}},
-- offer = {type='nothing', effect_description={'pirates.market_description_extra_time_at_sea'}},
-- },
}
function Public.get_cabin_surface_name()
local memory = Memory.get_crew_memory()
return SurfacesCommon.encode_surface_name(memory.id, 1, SurfacesCommon.enum.CABIN, enum.DEFAULT)
end
function Public.get_cabin_surface()
local name = Public.get_cabin_surface_name()
if name and game.surfaces[name] and game.surfaces[name].valid then return game.surfaces[Public.get_cabin_surface_name()] end
end
function Public.create_cabin_surface()
local memory = Memory.get_crew_memory()
local boat = memory.boat
if not Public.get_cabin_surface() then
local width = Public.Data.width
local height = Public.Data.height
local map_gen_settings = Common.default_map_gen_settings(width, height)
map_gen_settings.autoplace_settings.decorative.treat_missing_as_default = false
local cabinname = Public.get_cabin_surface_name()
local surface = game.create_surface(cabinname, map_gen_settings)
surface.freeze_daytime = true
surface.daytime = 0
surface.show_clouds = false
-- more here
Common.ensure_chunks_at(surface, {x = 0, y = 0}, 3)
boat.cabin_whitebelts = {}
for _, b in ipairs(Public.Data.cabin_whitebelts_lrtp_order) do
local p = {x = b.x, y = b.y}
local e = surface.create_entity({name = 'linked-belt', position = p, force = boat.force_name, create_build_effect_smoke = false, direction = b.direction})
if e and e.valid then
e.destructible = false
e.minable = false
e.rotatable = false
e.operable = false
e.linked_belt_type = b.type
boat.cabin_whitebelts[#boat.cabin_whitebelts + 1] = e
end
end
boat.cabin_splitters = {}
for i, splitter in ipairs(Public.Data.cabin_splitters) do
local name = 'express-splitter'
local p = {x = splitter.x, y = splitter.y}
local priority, filter
if splitter.type == 0 then
priority = 'right'
filter = 'coal'
elseif splitter.type <= 6 then
priority = 'right'
filter = game.item_prototypes[CoreData.cost_items[splitter.type].name]
elseif splitter.type == 7 then
priority = 'left'
elseif splitter.type == 8 then
priority = 'right'
filter = 'landfill'
elseif splitter.type == 9 then
priority = 'left'
filter = 'landfill'
end
local e = surface.create_entity({name = name, position = p, force = boat.force_name, create_build_effect_smoke = false, direction = splitter.direction})
if e and e.valid then
e.destructible = false
e.minable = false
e.rotatable = false
e.operable = false
if filter then e.splitter_filter = filter end
if priority then e.splitter_output_priority = priority end
boat.cabin_splitters[#boat.cabin_splitters + 1] = e
end
end
boat.input_chests = {}
for i, b in ipairs(Public.Data.input_chests) do
local p = {x = b.x, y = b.y}
local e = surface.create_entity({name = 'blue-chest', position = p, force = boat.force_name, create_build_effect_smoke = false})
if e and e.valid then
e.destructible = false
e.minable = false
e.rotatable = false
-- e.operable = false
boat.input_chests[#boat.input_chests + 1] = e
end
end
local p = {x = Public.Data.output_chest.x, y = Public.Data.output_chest.y}
local e = surface.create_entity({name = 'red-chest', position = p, force = boat.force_name, create_build_effect_smoke = false})
if e and e.valid then
e.destructible = false
e.minable = false
e.rotatable = false
-- e.operable = false
boat.output_chest = e
end
p = {x = Public.Data.backup_output_chest.x, y = Public.Data.backup_output_chest.y}
e = surface.create_entity({name = 'red-chest', position = p, force = boat.force_name, create_build_effect_smoke = false})
if e and e.valid then
e.destructible = false
e.minable = false
e.rotatable = false
-- e.operable = false
boat.backup_output_chest = e
end
local es = Common.build_from_blueprint(Public.Data.static_entities_bp, surface, {x=0, y=0}, boat.force_name)
for _, e2 in pairs(es) do
if e2 and e2.valid then
e2.destructible = false
e2.minable = false
e2.rotatable = false
e2.operable = false
end
end
-- local es2 = Common.build_from_blueprint(Public.Data.operable_entities_bp, surface, {x=5, y=-4}, boat.force_name)
-- for _, e2 in pairs(es2) do
-- if e2 and e2.valid then
-- e2.destructible = false
-- e2.minable = false
-- e2.rotatable = false
-- end
-- end
e = surface.create_entity({name = 'car', position = Public.Data.car_pos, force = boat.force_name, create_build_effect_smoke = false})
if e and e.valid then
e.get_inventory(defines.inventory.fuel).insert({name = 'wood', count = 16})
e.color = {148, 106, 52}
e.destructible = false
e.minable = false
e.rotatable = false
e.operable = false
end
e = surface.create_entity({name = 'market', position = Public.Data.market_position, force = boat.force_name, create_build_effect_smoke = false})
if e and e.valid then
e.destructible = false
e.minable = false
e.rotatable = false
for i, offer in pairs(Public.cabin_shop_data) do
offer.price = Public.get_market_random_price(i) or offer.price
e.add_market_item(offer)
end
end
rendering.draw_text(
{
color = {60, 255, 124},
scale = 1.6,
render_layer = 'light-effect',
target = e,
target_offset = {0, -2.7},
surface = e.surface,
alignment = 'center',
text = "Captain's Market"
})
rendering.draw_text{
text = {'pirates.surface_label_cabin'},
surface = surface,
target = Public.Data.surfacename_rendering_pos,
color = CoreData.colors.renderingtext_yellow,
scale = 3.5,
font = 'default-game',
alignment = 'center'
}
end
end
function Public.connect_up_linked_belts_to_deck() --assumes both are in standard lrtd order
local memory = Memory.get_crew_memory()
local boat = memory.boat
if boat and boat.deck_whitebelts and #boat.deck_whitebelts > 0 and boat.cabin_whitebelts and #boat.cabin_whitebelts > 0 then
local connections = {
{1,9},
{2,10},
{3,11},
{4,12},
{5,13},
{6,14},
{7,15},
{8,16},
}
for _, c in pairs(connections) do
local b1 = boat.cabin_whitebelts[c[1]]
local b2 = boat.deck_whitebelts[c[2]]
b1.connect_linked_belts(b2)
end
end
end
function Public.terrain(args)
if args.p.x > Public.Data.width/2-1 and (args.p.y > 2 or args.p.y < -2) then
args.tiles[#args.tiles + 1] = {name = 'out-of-map', position = args.p}
else
args.tiles[#args.tiles + 1] = {name = CoreData.static_boat_floor, position = args.p}
end
return nil
end
function Public.chunk_structures()
return nil
end
function Public.handle_purchase(market, slot)
local offers = market.get_market_items()
market.clear_market_items()
for i, offer in pairs(offers) do
if i == slot or slot == enum.SLOT_REROLL_PRICES then
offer.price = Public.get_market_random_price(i) or offer.price
end
market.add_market_item(offer)
end
end
function Public.get_market_random_price(slot)
local memory = Memory.get_crew_memory()
if slot == enum.SLOT_EXTRA_HOLD then
local tier = memory.hold_surface_count
return Common.pick_random_price(tier, Public.market_price_scale, math.min(0.8, 0.05 + tier * 0.2))
elseif slot == enum.SLOT_MORE_POWER then
local tier = memory.boat.EEI_stage
return Common.pick_random_price(tier, 0.5*Public.market_price_scale, math.min(0.8, 0.05 + tier * 0.2))
end
return nil
end
return Public