711 lines
20 KiB
Lua

if not bobmods.lib.resource then
bobmods.lib.resource = {}
end
bobmods.lib.resource_autoplace = require("resource-autoplace")
function bobmods.lib.resource.create_autoplace(inputs)
local autoplace = { control = inputs.control or inputs.name }
local richness = inputs.richness or 1
local size = inputs.size and inputs.size or 1.2
autoplace.sharpness = 1
autoplace.richness_multiplier = 1250 * richness
autoplace.richness_base = 8 * richness
autoplace.richness_multiplier_distance_bonus = 20
autoplace.coverage = size / 600
autoplace.peaks = {}
if inputs.starting_area == 1 then
autoplace.starting_area_size = 5500 * size / 600
autoplace.starting_area_amount = 1300 * size
end
if inputs.starting_area then
table.insert(
autoplace.peaks,
bobmods.lib.resource.autoplace_peak({
starting_area = 1,
noise = { layer = inputs.name, octaves = -0.85, persistance = 0.4 },
})
)
end
table.insert(
autoplace.peaks,
bobmods.lib.resource.autoplace_peak({
starting_area = 0,
noise = { layer = inputs.name, octaves = -0.85, persistance = 0.4 },
})
)
return autoplace
end
function bobmods.lib.resource.autoplace_peak(inputs)
local peak = {}
if inputs.influence then
influence = inputs.influence
end
if inputs.starting_area ~= nil then
peak.starting_area_weight_optimal = inputs.starting_area
peak.starting_area_weight_range = 0
peak.starting_area_weight_max_range = 2
end
if inputs.noise then
peak.noise_layer = inputs.noise.layer
peak.noise_octaves_difference = inputs.noise.octaves
peak.noise_persistence = inputs.noise.persistance
end
return peak
end
function bobmods.lib.resource.add_autoplace_peak(inputs)
table.insert(data.raw.resource[inputs.resource].autoplace.peaks, bobmods.lib.resource.autoplace_peak(inputs))
end
function bobmods.lib.resource.add_result(resource, item_in)
local item = bobmods.lib.item.result(item_in)
if item and type(resource) == "string" and data.raw.resource[resource] and bobmods.lib.item.get_type(item.name) then
bobmods.lib.result_check(data.raw.resource[resource].minable)
bobmods.lib.item.add_new(data.raw.resource[resource].minable.results, item)
else
log(debug.traceback())
bobmods.lib.error.resource(resource)
end
end
function bobmods.lib.resource.remove_result(resource, item)
if type(resource) == "string" and type(item) == "string" and data.raw.resource[resource] then
bobmods.lib.result_check(data.raw.resource[resource].minable)
bobmods.lib.item.remove(data.raw.resource[resource].minable.results, item)
else
log(debug.traceback())
bobmods.lib.error.resource(resource)
bobmods.lib.error.item(item)
end
end
function bobmods.lib.resource.stage_counts(stages, mult)
local stage_counts = {}
local stage = stages
while stage > 0 do
stage = stage - 1
table.insert(stage_counts, mult * (2 ^ stage))
end
return stage_counts
end
function bobmods.lib.resource.sprite(inputs)
local filename
local width = 38
local height = 38
local frame_count = 4
local variation_count = 8
local hr_version = nil
if inputs.width then
width = inputs.width
end
if inputs.height then
height = inputs.height
end
if inputs.frame_count then
frame_count = inputs.frame_count
end
if inputs.variation_count then
variation_count = inputs.variation_count
end
if inputs.hr_version then
hr_version = bobmods.lib.resource.hr_sprite(inputs.hr_version)
end
if inputs.filename then
filename = inputs.filename
else
filename = "__boblibrary__/graphics/entity/ores/ore-1.png"
width = 64
height = 64
frame_count = 8
variation_count = 8
hr_version = bobmods.lib.resource.hr_sprite({ sheet = 1, tint = inputs.tint })
if inputs.sheet == 2 then
filename = "__boblibrary__/graphics/entity/ores/ore-2.png"
hr_version = bobmods.lib.resource.hr_sprite({ sheet = 2, tint = inputs.tint })
end
if inputs.sheet == 3 then
filename = "__boblibrary__/graphics/entity/ores/ore-3.png"
hr_version = bobmods.lib.resource.hr_sprite({ sheet = 3, tint = inputs.tint })
end
if inputs.sheet == 4 then
filename = "__boblibrary__/graphics/entity/ores/ore-4.png"
hr_version = bobmods.lib.resource.hr_sprite({ sheet = 4, tint = inputs.tint })
end
if inputs.sheet == 5 then
filename = "__boblibrary__/graphics/entity/liquid.png"
width = 75
height = 61
frame_count = 4
variation_count = 1
hr_version = nil
end
if inputs.sheet == 6 then
filename = "__boblibrary__/graphics/entity/ores/ore-5.png"
hr_version = bobmods.lib.resource.hr_sprite({ sheet = 5, tint = inputs.tint })
end
end
local sheet = {
filename = filename,
priority = "extra-high",
width = width,
height = height,
frame_count = frame_count,
variation_count = variation_count,
tint = inputs.tint,
scale = inputs.scale or 1,
}
if hr_version then
sheet.hr_version = hr_version
end
return {
sheet = sheet,
}
end
function bobmods.lib.resource.hr_sprite(inputs)
local filename
local width = 128
local height = 128
local frame_count = 8
local variation_count = 8
local scale = 0.5
if inputs.width then
width = inputs.width
end
if inputs.height then
height = inputs.height
end
if inputs.frame_count then
frame_count = inputs.frame_count
end
if inputs.variation_count then
variation_count = inputs.variation_count
end
if inputs.scale then
scale = inputs.scale
end
if inputs.filename then
filename = inputs.filename
else
filename = "__boblibrary__/graphics/entity/ores/hr-ore-1.png"
width = 128
height = 128
frame_count = 8
variation_count = 8
scale = 0.5
if inputs.sheet == 2 then
filename = "__boblibrary__/graphics/entity/ores/hr-ore-2.png"
end
if inputs.sheet == 3 then
filename = "__boblibrary__/graphics/entity/ores/hr-ore-3.png"
end
if inputs.sheet == 4 then
filename = "__boblibrary__/graphics/entity/ores/hr-ore-4.png"
end
if inputs.sheet == 5 then
filename = "__boblibrary__/graphics/entity/ores/hr-ore-5.png"
end
end
return {
filename = filename,
priority = "extra-high",
width = width,
height = height,
frame_count = frame_count,
variation_count = variation_count,
tint = inputs.tint,
scale = scale,
}
end
function bobmods.lib.resource.effect(inputs)
local filename
local width = 64
local height = 64
local frame_count = 8
local variation_count = 8
local hr_version = nil
if inputs.width then
width = inputs.width
end
if inputs.height then
height = inputs.height
end
if inputs.frame_count then
frame_count = inputs.frame_count
end
if inputs.variation_count then
variation_count = inputs.variation_count
end
if inputs.hr_version then
hr_version = bobmods.lib.resource.hr_effect(inputs.hr_version)
end
if inputs.filename then
filename = inputs.filename
else
filename = "__boblibrary__/graphics/entity/ores/ore-5-glow.png"
width = 64
height = 64
frame_count = 8
variation_count = 8
hr_version = bobmods.lib.resource.hr_effect({ sheet = 5, tint = inputs.tint })
end
local sheet = {
filename = filename,
priority = "extra-high",
width = width,
height = height,
frame_count = frame_count,
variation_count = variation_count,
tint = inputs.tint,
scale = inputs.scale or 1,
blend_mode = "additive",
flags = { "light" },
}
if hr_version then
sheet.hr_version = hr_version
end
return {
sheet = sheet,
}
end
function bobmods.lib.resource.hr_effect(inputs)
local filename
local width = 128
local height = 128
local frame_count = 8
local variation_count = 8
local scale = 0.5
if inputs.width then
width = inputs.width
end
if inputs.height then
height = inputs.height
end
if inputs.frame_count then
frame_count = inputs.frame_count
end
if inputs.variation_count then
variation_count = inputs.variation_count
end
if inputs.scale then
scale = inputs.scale
end
if inputs.filename then
filename = inputs.filename
else
filename = "__boblibrary__/graphics/entity/ores/hr-ore-5-glow.png"
width = 128
height = 128
frame_count = 8
variation_count = 8
scale = 0.5
end
return {
filename = filename,
priority = "extra-high",
width = width,
height = height,
frame_count = frame_count,
variation_count = variation_count,
tint = inputs.tint,
blend_mode = "additive",
flags = { "light" },
scale = scale,
}
end
function bobmods.lib.resource.create_item(inputs)
data:extend({
{
type = "item",
name = inputs.name,
subgroup = inputs.subgroup or "raw-resource",
order = "b-d[" .. inputs.name .. "]",
stack_size = inputs.stack_size or 200,
},
})
if inputs.icon then
data.raw.item[inputs.name].icon = inputs.icon
data.raw.item[inputs.name].icon_size = inputs.icon_size or 32
data.raw.item[inputs.name].icon_mipmaps = inputs.icon_mipmaps
elseif inputs.icons then
data.raw.item[inputs.name].icon = inputs.icons
else
data.raw.item[inputs.name].icons = bobmods.lib.resource.create_icon(inputs)
end
if inputs.create_variations then
local type = 1
if inputs.sprite and inputs.sprite.sheet then
if inputs.sprite.sheet >= 1 and inputs.sprite.sheet <= 4 then
type = inputs.sprite.sheet
elseif inputs.sprite.sheet == 6 then
type = 5
end
end
data.raw.item[inputs.name].pictures = {}
for i = 16, 1, -1 do --do it 16 times
table.insert(
data.raw.item[inputs.name].pictures,
bobmods.lib.resource.get_icon_variation_single(type, inputs.tint)
)
end
end
end
function bobmods.lib.resource.create(inputs)
local sprite = {}
local minimum = 35
local normal = 350
if inputs.sprite then
sprite = inputs.sprite
end
sprite.tint = inputs.tint
if inputs.minimum then
minimum = inputs.minimum
elseif inputs.autoplace and inputs.autoplace.richness_base then
minimum = inputs.autoplace.richness_base * 5
end
if inputs.normal then
normal = inputs.normal
elseif inputs.autoplace and inputs.autoplace.richness_base then
normal = inputs.autoplace.richness_base * 50
end
if minimum < 1 then
minimum = 1
end
if normal < 1 then
normal = 1
end
local sheet = bobmods.lib.resource.sprite(sprite)
data:extend({
{
type = "resource",
name = inputs.name,
flags = { "placeable-neutral" },
category = inputs.category,
order = "b-d-" .. inputs.name,
minimum = minimum,
normal = normal,
resource_patch_search_radius = inputs.resource_patch_search_radius,
infinite = inputs.infinite,
collision_box = inputs.collision_box or { { -0.1, -0.1 }, { 0.1, 0.1 } },
selection_box = inputs.selection_box or { { -0.5, -0.5 }, { 0.5, 0.5 } },
stages = sheet,
stage_counts = inputs.stage_counts
or bobmods.lib.resource.stage_counts(sheet.sheet.variation_count, inputs.stage_mult or 100),
map_color = inputs.map_color,
minable = {
mining_particle = inputs.particle,
mining_time = inputs.mining_time or 2,
},
},
})
if inputs.disable_map_grid then
data.raw.resource[inputs.name].map_grid = false
end
if inputs.infinite then
local infinite_depletion_amount = inputs.infinite_depletion_amount or 10
data.raw.resource[inputs.name].infinite_depletion_amount = infinite_depletion_amount
end
if inputs.icon then
data.raw.resource[inputs.name].icon = inputs.icon
data.raw.resource[inputs.name].icon_size = inputs.icon_size or 32
data.raw.resource[inputs.name].icon_mipmaps = inputs.icon_mipmaps
else
data.raw.resource[inputs.name].icons = bobmods.lib.resource.create_icon(inputs)
end
if inputs.required_fluid then
data.raw.resource[inputs.name].minable.required_fluid = inputs.required_fluid
data.raw.resource[inputs.name].minable.fluid_amount = inputs.fluid_amount or 10
end
if inputs.effect then
local effect = inputs.effect
effect.tint = inputs.tint
data.raw.resource[inputs.name].stages_effect = bobmods.lib.resource.effect(effect)
data.raw.resource[inputs.name].effect_animation_period = inputs.effect.animation_period or 5
data.raw.resource[inputs.name].effect_animation_period_deviation = inputs.effect.animation_period_deviation or 1
data.raw.resource[inputs.name].effect_darkness_multiplier = inputs.effect.darkness_multiplier or 3.6
data.raw.resource[inputs.name].min_effect_alpha = inputs.effect.min_alpha or 0.2
data.raw.resource[inputs.name].max_effect_alpha = inputs.effect.max_alpha or 0.3
end
end
function bobmods.lib.resource.create_icon(inputs)
local icon = { icon = "__boblibrary__/graphics/icons/ore-1.png", tint = inputs.tint, icon_size = 32 }
if inputs.sprite then
if inputs.sprite.sheet == 2 then
icon.icon = "__boblibrary__/graphics/icons/ore-2.png"
end
if inputs.sprite.sheet == 3 then
icon.icon = "__boblibrary__/graphics/icons/ore-3.png"
end
if inputs.sprite.sheet == 4 then
icon.icon = "__boblibrary__/graphics/icons/ore-4.png"
end
if inputs.sprite.sheet == 5 then
icon.icon = "__boblibrary__/graphics/icons/liquid.png"
end
if inputs.sprite.sheet == 6 then
icon.icon = "__boblibrary__/graphics/icons/ore-5.png"
end
end
return { icon }
end
function bobmods.lib.resource.create_particle(inputs)
data:extend({
{
type = "optimized-particle",
name = inputs.name,
life_time = 180,
pictures = {
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-1.png",
priority = "extra-high",
tint = inputs.tint,
width = 5,
height = 5,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-2.png",
priority = "extra-high",
tint = inputs.tint,
width = 7,
height = 5,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-3.png",
priority = "extra-high",
tint = inputs.tint,
width = 6,
height = 7,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-4.png",
priority = "extra-high",
tint = inputs.tint,
width = 9,
height = 8,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-5.png",
priority = "extra-high",
tint = inputs.tint,
width = 5,
height = 5,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-6.png",
priority = "extra-high",
tint = inputs.tint,
width = 6,
height = 4,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-7.png",
priority = "extra-high",
tint = inputs.tint,
width = 7,
height = 8,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-8.png",
priority = "extra-high",
tint = inputs.tint,
width = 6,
height = 5,
frame_count = 1,
},
},
shadows = {
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-shadow-1.png",
priority = "extra-high",
width = 5,
height = 5,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-shadow-2.png",
priority = "extra-high",
width = 7,
height = 5,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-shadow-3.png",
priority = "extra-high",
width = 6,
height = 7,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-shadow-4.png",
priority = "extra-high",
width = 9,
height = 8,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-shadow-5.png",
priority = "extra-high",
width = 5,
height = 5,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-shadow-6.png",
priority = "extra-high",
width = 6,
height = 4,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-shadow-7.png",
priority = "extra-high",
width = 7,
height = 8,
frame_count = 1,
},
{
filename = "__boblibrary__/graphics/entity/ores/ore-particle-shadow-8.png",
priority = "extra-high",
width = 6,
height = 5,
frame_count = 1,
},
},
},
})
end
function bobmods.lib.resource.generate_data_stage(inputs)
if inputs.name then
if not inputs.particle then
inputs.particle = inputs.name .. "-particle"
bobmods.lib.resource.create_particle({ name = inputs.particle, tint = inputs.tint })
end
if inputs.item and inputs.item.create then
if not inputs.items then
inputs.items = {}
end
local item = {
name = inputs.name,
icon = inputs.icon,
subgroup = inputs.item.subgroup,
stack_size = inputs.item.stack_size,
tint = inputs.tint,
create_variations = inputs.item.create_variations,
}
if inputs.sprite then
item.sprite = inputs.sprite
end
bobmods.lib.resource.create_item(item)
table.insert(inputs.items, { name = inputs.name })
end
if inputs.autoplace == nil then
inputs.autoplace = bobmods.lib.resource.create_autoplace({
control = inputs.name or inputs.name,
name = inputs.name,
starting_area = true,
size = 1,
richness = 1,
})
elseif type(inputs.autoplace) == "table" then
if inputs.autoplace.create then
local autoplace = bobmods.lib.resource.create_autoplace({
control = inputs.autoplace.control or inputs.name,
name = inputs.name,
starting_area = inputs.autoplace.starting_area,
size = inputs.autoplace.size,
richness = inputs.autoplace.richness,
})
inputs.autoplace = autoplace
end
end
bobmods.lib.resource.create(inputs)
if inputs.items then
for i, item in pairs(inputs.items) do
bobmods.lib.resource.add_result(inputs.name, item)
end
end
end
end
function bobmods.lib.resource.generate_autoplace_control(control)
if not data.raw["autoplace-control"][control] then
data:extend({
{
type = "autoplace-control",
name = control,
richness = true,
order = "b-d-" .. control,
category = "resource",
},
})
data.raw["map-gen-presets"].default["rich-resources"].basic_settings.autoplace_controls[control] =
{ richness = "very-good" }
data.raw["map-gen-presets"].default["rail-world"].basic_settings.autoplace_controls[control] =
{ frequency = 0.33333333333, size = 3 }
data.raw["map-gen-presets"].default["ribbon-world"].basic_settings.autoplace_controls[control] =
{ frequency = 3, size = 0.5, richness = 2 }
end
end
function bobmods.lib.resource.generate_updates_stage(inputs)
if data.raw.resource[inputs.name] and inputs.autoplace then
local control = inputs.name
if type(inputs.autoplace) == "table" and inputs.autoplace.control then
control = inputs.autoplace.control
log(inputs.autoplace.control)
end
bobmods.lib.resource.generate_autoplace_control(control)
data.raw["autoplace-control"][control].localised_name =
{ "", "[entity=" .. inputs.name .. "] ", { "entity-name." .. inputs.name } }
if not data.raw["noise-layer"][inputs.name] and inputs.autoplace ~= "control-only" then
data:extend({
{
type = "noise-layer",
name = inputs.name,
},
})
end
if inputs.autoplace ~= "control-only" then
data.raw.resource[inputs.name].autoplace = inputs.autoplace
end
end
end
function bobmods.lib.resource.generate(inputs)
bobmods.lib.resource.generate_data_stage(inputs)
bobmods.lib.resource.generate_updates_stage(inputs)
end