Integrate wood logistics code into this mod

This commit is contained in:
Simon Brodtmann 2025-12-16 21:07:23 +01:00
parent 709c834ebd
commit e213ae9f2f
3 changed files with 463 additions and 95 deletions

View file

@ -48,6 +48,8 @@ AAILoaders.make_tier({
data.raw.recipe["aai-wood-loader"].additional_categories = { "wood-processing" }
data.raw["loader-1x1"]["aai-wood-loader"].animation_speed_coefficient = 1.01 * 32
if not basic_circuit_board then
local nauvis_recipe = Recipe:new("aai-wood-loader"):clone("wood-loader-electronic-circuit")
nauvis_recipe:replaceIngredient("gold-cable", "electronic-circuit")

View file

@ -21,6 +21,7 @@ lane_splitter.prototype.structure_patch.east.filename = data.raw.splitter["wood-
lane_splitter.prototype.structure_patch.south.filename = data.raw.splitter["wood-splitter"].structure_patch.south.filename
lane_splitter.prototype.structure_patch.west.filename = data.raw.splitter["wood-splitter"].structure_patch.west.filename
lane_splitter.prototype.structure_patch.north.filename = data.raw.splitter["wood-splitter"].structure_patch.north.filename
lane_splitter.prototype.animation_speed_coefficient = 1.01 * 32
lane_splitter.item.icon = Lignumis.graphics .. "icons/wood-lane-splitter.png"
lane_splitter.item.order = "d[lane-splitter]-0[wood-lane-splitter]"
lane_splitter.recipe.additional_categories = { "wood-processing" }

View file

@ -1,108 +1,473 @@
local BeltFactory = require(MF.logistics .. "Belts")
local Belt = BeltFactory("wood", "brown", "slow")
local basic_circuit_board = settings.startup["lignumis-basic-circuit-board"].value
local meld = require("meld")
local hit_effects = require("__base__.prototypes.entity.hit-effects")
local sounds = require("__base__.prototypes.entity.sounds")
local item_sounds = require("__base__.prototypes.item_sounds")
local Recipe = require("__cf-lib__/data/Recipe")
if mods["wood-logistics"] and settings.startup["wood-logistics-belts"].value then
return
end
Belt.EntityBuilder:new()
:itemsPerSecond(7.5)
:nextTier("")
:undergroundDistance(4)
:animationSpeedMultiplier(1.01)
:apply({
transportBelt = {
emissions_per_second = { noise = 2 / 60 }
},
undergroundBelt = {
emissions_per_second = { noise = 7.5 / 60 },
factoriopedia_simulation = {
init =
[[
game.simulation.camera_position = {0, 0.5}
game.simulation.camera_zoom = 1.8
game.surfaces[1].create_entities_from_blueprint_string
{
string = "0eNqVUNsKgzAM/Zc81+FEBfsrYwwvQQKaltpuivjvS3Wwh8HGnkKSc0tWaIaA1hF70CtMXNvEm6R31MV+Bl0oWECfNwXUGp5AXwRGPddDBHA9Imh4GNMlgTt0vTNSkwYHD5EjsznSrwqQPXnCQ2JvlhuHsUEnAPVdSoE1k7ANv2KlpyOYVLHpyGF7bHMFfrFRidiGGOLDLPvXLP9tZoLf3eRO8jjK5P1YBXd0004oyqzKq6ooqzLNinLbnvlmf6E=",
position = {-0.5, 0}
}
]]
local basic_circuit_board = settings.startup["lignumis-basic-circuit-board"].value
local speed = 7.5 / 480
local name = "wood"
local transportBeltName = name .. "-transport-belt"
local undergroundBeltName = name .. "-underground-belt"
local splitterName = name .. "-splitter"
local gfx = Lignumis.graphics .. "entity/wood-logistics/"
local function createAnimation()
return meld({
animation_set = {
filename = gfx .. "wood-transport-belt.png",
priority = "extra-high",
size = 128,
scale = 0.5,
frame_count = 16,
direction_count = 20
}
}, belt_reader_gfx)
end
data:extend({
{
type = "transport-belt",
name = transportBeltName,
icon = Lignumis.graphics .. "icons/wood-transport-belt.png",
flags = { "placeable-neutral", "player-creation" },
minable = { mining_time = 0.1, result = transportBeltName },
max_health = 150,
next_upgrade = "transport-belt",
corpse = transportBeltName .. "-remnants",
dying_explosion = "transport-belt-explosion",
resistances = {
{
type = "fire",
percent = 90
}
},
splitter = {
emissions_per_second = { noise = 20 / 60 }
}
})
local splitter_item = Belt.ItemBuilder:new()
:itemsPerRocket("transportBelt", 200)
:itemsPerRocket("undergroundBelt", 100)
:itemsPerRocket("splitter", 100)
:order("0")
:apply()
.splitter
Belt.RecipeBuilder:new()
:beltAmount(2)
:ingredients("transportBelt", {
{ type = "item", name = "lumber", amount = 1 },
{ type = "item", name = "wooden-gear-wheel", amount = 1 }
})
:ingredients("undergroundBelt", {
{ type = "item", name = "lumber", amount = 1 },
{ type = "item", name = "wood-transport-belt", amount = 4 },
})
:ingredients("splitter", {
{ type = "item", name = "wood-transport-belt", amount = 2 },
{ type = "item", name = "lumber", amount = 2 },
basic_circuit_board and { type = "item", name = "basic-circuit-board", amount = 5 } or
{ type = "item", name = "gold-cable", amount = 10 }
})
:apply({
transportBelt = {
additional_categories = { "wood-processing" }
emissions_per_second = { noise = 2 / 60 },
collision_box = { { -0.4, -0.4 }, { 0.4, 0.4 } },
selection_box = { { -0.5, -0.5 }, { 0.5, 0.5 } },
damaged_trigger_effect = hit_effects.entity(),
open_sound = sounds.transport_belt_open,
close_sound = sounds.transport_belt_close,
working_sound = {
sound = { filename = "__base__/sound/transport-belt.ogg", volume = 0.17 },
persistent = true
},
undergroundBelt = {
additional_categories = { "wood-processing" }
animation_speed_coefficient = 1.01 * 32,
fast_replaceable_group = "transport-belt",
related_underground_belt = undergroundBeltName,
speed = speed,
belt_animation_set = createAnimation(),
connector_frame_sprites = transport_belt_connector_frame_sprites,
circuit_connector = circuit_connector_definitions["belt"],
circuit_wire_max_distance = transport_belt_circuit_wire_max_distance
},
{
type = "corpse",
name = transportBeltName .. "-remnants",
icon = Lignumis.graphics .. "icons/wood-transport-belt.png",
hidden_in_factoriopedia = true,
flags = { "placeable-neutral", "not-on-map" },
subgroup = "belt-remnants",
order = "a-a-a",
selection_box = { { -0.5, -0.5 }, { 0.5, 0.5 } },
tile_width = 1,
tile_height = 1,
selectable_in_game = false,
time_before_removed = 60 * 60 * 15, -- 15 minutes
expires = false,
final_render_layer = "remnants",
animation = make_rotated_animation_variations_from_sheet(2, {
filename = gfx .. "wood-transport-belt-remnants.png",
line_length = 1,
width = 106,
height = 102,
direction_count = 4,
shift = util.by_pixel(1, -0.5),
scale = 0.5
})
},
{
type = "underground-belt",
name = undergroundBeltName,
icon = Lignumis.graphics .. "icons/wood-underground-belt.png",
flags = { "placeable-neutral", "player-creation" },
minable = { mining_time = 0.1, result = undergroundBeltName },
max_health = 150,
next_upgrade = "underground-belt",
corpse = undergroundBeltName .. "-remnants",
dying_explosion = "underground-belt-explosion",
factoriopedia_simulation = {
init =
[[
game.simulation.camera_position = {0, 0.5}
game.simulation.camera_zoom = 1.8
game.surfaces[1].create_entities_from_blueprint_string
{
string = "0eNqVUNsKgzAM/Zc81+FEBfsrYwwvQQKaltpuivjvS3Wwh8HGnkKSc0tWaIaA1hF70CtMXNvEm6R31MV+Bl0oWECfNwXUGp5AXwRGPddDBHA9Imh4GNMlgTt0vTNSkwYHD5EjsznSrwqQPXnCQ2JvlhuHsUEnAPVdSoE1k7ANv2KlpyOYVLHpyGF7bHMFfrFRidiGGOLDLPvXLP9tZoLf3eRO8jjK5P1YBXd0004oyqzKq6ooqzLNinLbnvlmf6E=",
position = {-0.5, 0}
}
]]
},
splitter = {
additional_categories = { "wood-processing" }
max_distance = 4,
open_sound = sounds.machine_open,
close_sound = sounds.machine_close,
working_sound = table.deepcopy(data.raw["underground-belt"]["underground-belt"].working_sound),
underground_sprite = table.deepcopy(data.raw["underground-belt"]["underground-belt"].underground_sprite),
resistances = {
{
type = "fire",
percent = 60
},
{
type = "impact",
percent = 30
}
},
emissions_per_second = { noise = 7.5 / 60 },
collision_box = { { -0.4, -0.4 }, { 0.4, 0.4 } },
selection_box = { { -0.5, -0.5 }, { 0.5, 0.5 } },
damaged_trigger_effect = hit_effects.entity(),
animation_speed_coefficient = 1.01 * 32,
fast_replaceable_group = "transport-belt",
speed = speed,
structure = {
direction_in = {
sheet = {
filename = gfx .. "wood-underground-belt-structure.png",
priority = "extra-high",
width = 192,
height = 192,
y = 192,
scale = 0.5
}
},
direction_out = {
sheet = {
filename = gfx .. "wood-underground-belt-structure.png",
priority = "extra-high",
width = 192,
height = 192,
scale = 0.5
}
},
direction_in_side_loading = {
sheet = {
filename = gfx .. "wood-underground-belt-structure.png",
priority = "extra-high",
width = 192,
height = 192,
y = 192 * 3,
scale = 0.5
}
},
direction_out_side_loading = {
sheet = {
filename = gfx .. "wood-underground-belt-structure.png",
priority = "extra-high",
width = 192,
height = 192,
y = 192 * 2,
scale = 0.5
}
},
back_patch = {
sheet = {
filename =
"__base__/graphics/entity/underground-belt/underground-belt-structure-back-patch.png",
priority = "extra-high",
width = 192,
height = 192,
scale = 0.5
}
},
front_patch = {
sheet = {
filename =
"__base__/graphics/entity/underground-belt/underground-belt-structure-front-patch.png",
priority = "extra-high",
width = 192,
height = 192,
scale = 0.5
}
}
},
belt_animation_set = createAnimation()
},
{
type = "corpse",
name = undergroundBeltName .. "-remnants",
icon = Lignumis.graphics .. "icons/wood-underground-belt.png",
hidden_in_factoriopedia = true,
flags = { "placeable-neutral", "not-on-map", "building-direction-8-way" },
subgroup = "belt-remnants",
order = "a-d-a",
selection_box = { { -0.5, -0.5 }, { 0.5, 0.5 } },
tile_width = 1,
tile_height = 1,
selectable_in_game = false,
time_before_removed = 60 * 60 * 15, -- 15 minutes
expires = false,
final_render_layer = "remnants",
remove_on_tile_placement = false,
animation = {
filename = gfx .. "wood-underground-belt-remnants.png",
line_length = 1,
width = 156,
height = 144,
direction_count = 8,
shift = util.by_pixel(10.5, 3),
scale = 0.5
}
})
Belt.TechnologyBuilder:new()
:prerequisites({ "wood-science-pack" })
:ingredients({ { "wood-science-pack", 1 } })
:count(10)
:time(10)
:apply()
},
{
type = "splitter",
name = splitterName,
icon = Lignumis.graphics .. "icons/wood-splitter.png",
flags = { "placeable-neutral", "player-creation" },
minable = { mining_time = 0.1, result = splitterName },
max_health = 170,
next_upgrade = "splitter",
corpse = splitterName .. "-remnants",
dying_explosion = "splitter-explosion",
resistances = {
{
type = "fire",
percent = 60
}
},
emissions_per_second = { noise = 20 / 60 },
collision_box = { { -0.9, -0.4 }, { 0.9, 0.4 } },
selection_box = { { -0.9, -0.5 }, { 0.9, 0.5 } },
damaged_trigger_effect = hit_effects.entity(),
animation_speed_coefficient = 1.01 * 32,
structure_animation_speed_coefficient = 0.7,
structure_animation_movement_cooldown = 10,
icon_draw_specification = { scale = 0.5 },
fast_replaceable_group = "transport-belt",
speed = speed,
open_sound = sounds.machine_open,
close_sound = sounds.machine_close,
working_sound = sounds.splitter,
related_transport_belt = transportBeltName,
structure = {
north = {
filename = gfx .. "wood-splitter-north.png",
frame_count = 32,
line_length = 8,
priority = "extra-high",
width = 160,
height = 70,
shift = util.by_pixel(7, 0),
scale = 0.5
},
east = {
filename = gfx .. "wood-splitter-east.png",
frame_count = 32,
line_length = 8,
priority = "extra-high",
width = 90,
height = 84,
shift = util.by_pixel(4, 13),
scale = 0.5
},
south = {
filename = gfx .. "wood-splitter-south.png",
frame_count = 32,
line_length = 8,
priority = "extra-high",
width = 164,
height = 64,
shift = util.by_pixel(4, 0),
scale = 0.5
},
west = {
filename = gfx .. "wood-splitter-west.png",
frame_count = 32,
line_length = 8,
priority = "extra-high",
width = 90,
height = 86,
shift = util.by_pixel(6, 12),
scale = 0.5
}
},
structure_patch = {
north = util.empty_sprite(),
east = {
filename = gfx .. "wood-splitter-east-top_patch.png",
frame_count = 32,
line_length = 8,
priority = "extra-high",
width = 90,
height = 104,
shift = util.by_pixel(4, -20),
scale = 0.5
},
south = util.empty_sprite(),
west = {
filename = gfx .. "wood-splitter-west-top_patch.png",
frame_count = 32,
line_length = 8,
priority = "extra-high",
width = 90,
height = 96,
shift = util.by_pixel(6, -18),
scale = 0.5
}
},
belt_animation_set = createAnimation()
},
{
type = "corpse",
name = splitterName .. "-remnants",
icon = Lignumis.graphics .. "icons/wood-splitter.png",
hidden_in_factoriopedia = true,
flags = { "placeable-neutral", "not-on-map" },
subgroup = "belt-remnants",
order = "a-g-a",
selection_box = { { -0.9, -0.5 }, { 0.9, 0.5 } },
tile_width = 2,
tile_height = 1,
selectable_in_game = false,
time_before_removed = 60 * 60 * 15, -- 15 minutes
expires = false,
final_render_layer = "remnants",
remove_on_tile_placement = false,
animation = {
filename = gfx .. "wood-splitter-remnants.png",
line_length = 1,
width = 190,
height = 190,
direction_count = 4,
shift = util.by_pixel(3.5, 1.5),
scale = 0.5
}
},
{
type = "item",
name = transportBeltName,
icon = Lignumis.graphics .. "icons/wood-transport-belt.png",
subgroup = "belt",
color_hint = { text = "1" },
order = "a[transport-belt]-0[" .. transportBeltName .. "]",
inventory_move_sound = item_sounds.transport_belt_inventory_move,
pick_sound = item_sounds.transport_belt_inventory_pickup,
drop_sound = item_sounds.transport_belt_inventory_move,
place_result = transportBeltName,
stack_size = 100,
weight = 5 * kg
},
{
type = "item",
name = undergroundBeltName,
icon = Lignumis.graphics .. "icons/wood-underground-belt.png",
subgroup = "belt",
color_hint = { text = "1" },
order = "b[underground-belt]-0[" .. undergroundBeltName .. "]",
inventory_move_sound = item_sounds.mechanical_inventory_move,
pick_sound = item_sounds.mechanical_inventory_pickup,
drop_sound = item_sounds.mechanical_inventory_move,
place_result = undergroundBeltName,
stack_size = 50,
weight = 10 * kg
},
{
type = "item",
name = splitterName,
icon = Lignumis.graphics .. "icons/wood-splitter.png",
subgroup = "belt",
color_hint = { text = "1" },
order = "c[splitter]-0[" .. splitterName .. "]",
inventory_move_sound = item_sounds.mechanical_inventory_move,
pick_sound = item_sounds.mechanical_inventory_pickup,
drop_sound = item_sounds.mechanical_inventory_move,
place_result = splitterName,
stack_size = 50,
weight = 10 * kg
},
{
type = "recipe",
name = transportBeltName,
enabled = false,
energy_required = 0.5,
results = { { type = "item", name = transportBeltName, amount = 2 } },
ingredients = {
{ type = "item", name = "lumber", amount = 1 },
{ type = "item", name = "wooden-gear-wheel", amount = 1 }
}
},
{
type = "recipe",
name = undergroundBeltName,
category = "crafting",
additional_categories = { "wood-processing" },
enabled = false,
energy_required = 1,
ingredients = {
{ type = "item", name = "lumber", amount = 1 },
{ type = "item", name = "wood-transport-belt", amount = 4 },
},
results = { { type = "item", name = undergroundBeltName, amount = 2 } }
},
{
type = "recipe",
name = splitterName,
category = "crafting",
additional_categories = { "wood-processing" },
enabled = false,
energy_required = 1,
ingredients = {
{ type = "item", name = "wood-transport-belt", amount = 2 },
{ type = "item", name = "lumber", amount = 2 },
basic_circuit_board and { type = "item", name = "basic-circuit-board", amount = 5 } or
{ type = "item", name = "gold-cable", amount = 10 }
},
results = { { type = "item", name = splitterName, amount = 1 } }
},
{
type = "technology",
name = name .. "-logistics",
category = "crafting",
additional_categories = { "wood-processing" },
icon = Lignumis.graphics .. "technology/wood-logistics.png",
icon_size = 256,
effects = {
{
type = "unlock-recipe",
recipe = "wood-transport-belt"
},
{
type = "unlock-recipe",
recipe = "wood-underground-belt"
},
{
type = "unlock-recipe",
recipe = "wood-splitter"
}
},
prerequisites = { "wood-science-pack" },
unit = {
count = 10,
ingredients = { { "wood-science-pack", 1 } },
time = 10
}
}
})
if not basic_circuit_board then
data:extend({
Belt.RecipeBuilder:new()
:ingredients("splitter", {
{ type = "item", name = "wood-transport-belt", amount = 2 },
{ type = "item", name = "lumber", amount = 2 },
{ type = "item", name = "electronic-circuit", amount = 2 }
})
:build({
splitter = {
name = "wood-splitter-electronic-circuit",
localised_name = { "entity-name.wood-splitter" },
icons = {
{ icon = splitter_item.icon },
{ icon = "__base__/graphics/icons/electronic-circuit.png", scale = 0.25, shift = { 8, 8 } }
},
additional_categories = { "wood-processing" }
}
})
.splitter
})
table.insert(data.raw.technology["electronics"].effects, {
type = "unlock-recipe",
recipe = "wood-splitter-electronic-circuit"
})
Recipe:new("wood-splitter"):clone("wood-splitter-electronic-circuit")
:replaceIngredient("gold-cable", "electronic-circuit", 2)
:assign({
localised_name = { "entity-name.wood-splitter" },
icons = {
{ icon = gfx .. "wood-splitter-icon.png" },
{ icon = "__base__/graphics/icons/electronic-circuit.png", scale = 0.25, shift = { 8, 8 } }
}
})
:unlockedByTechnology("electronics")
:apply()
end