149 lines
5.7 KiB
Lua

local util = require("util")
local function scale_energy(energy, factor)
local value = tonumber(energy:match("[%d\\.]+"))
local suffix = energy:match("[%l%u]+")
if value and type(value) == "number" then
if suffix == "kJ" then
suffix = "J"
factor = factor * 1000
end
if suffix == "kW" then
suffix = "W"
factor = factor * 1000
end
value = math.ceil(value * factor / 5) * 5
energy = string.format("%d" .. suffix, value)
end
return energy
end
--
local function change_sprite_scale(sprite, scale)
if not sprite then
return
end
if sprite.scale then
sprite.scale = sprite.scale * scale
else
sprite.scale = scale
end
if sprite.hr_version then
return change_sprite_scale(sprite.hr_version, scale)
end
return sprite
end
--
local function calculate_performance(entity, wide, forced_ips)
local performance = {
rotation_speed = 1 / 60,
extension_speed = 1 / 60,
stack_size_bonus = 50,
energy_per_movement = entity.energy_per_movement,
energy_per_rotation = entity.energy_per_rotation
}
local old_stack_size = 1 + (entity.stack_size_bonus or 0)
if entity.stack then
old_stack_size = old_stack_size + 11
else
old_stack_size = old_stack_size + 2
end
--log("old_stack_size: " .. tostring(old_stack_size))
--log("entity.rotation_speed_tick: " .. tostring(entity.rotation_speed))
--log("rotation_speed_sec: " .. tostring(entity.rotation_speed * 60))
performance._ips_old = entity.rotation_speed * 60 * old_stack_size
performance._ips_new = forced_ips or (((wide and 16) or 4.5) * performance._ips_old)
local max_stack_size_bonus = 250
if settings.startup["max_stack_size_bonus"] and settings.startup["max_stack_size_bonus"].value then
max_stack_size_bonus = tonumber(settings.startup["max_stack_size_bonus"].value)
end
local new_stack_size_bonus = math.min(max_stack_size_bonus, math.floor(performance._ips_new / 25 + 0.5) * 25)
performance._new_speed_sec = performance._ips_new / new_stack_size_bonus
performance.rotation_speed = math.floor(10000 * performance._new_speed_sec / 60) / 10000
performance.extension_speed = math.floor(10000 * performance._new_speed_sec / 60) / 10000
performance.stack_size_bonus = math.max(0, new_stack_size_bonus - 1 - 2)
local energy_scale = (new_stack_size_bonus/max_stack_size_bonus) * (entity.rotation_speed/performance.rotation_speed) * ((wide and 16) or 4.5) * 1.75
performance.energy_per_movement = scale_energy(performance.energy_per_movement, energy_scale)
performance.energy_per_rotation = scale_energy(performance.energy_per_rotation, energy_scale)
return performance
end
local function make_crane_entity(entityName, newName, wide, forced_ips)
local entity = util.table.deepcopy(data.raw["inserter"][entityName])
--log(serpent.block(entity))
entity.name = newName
if entity.filter_count and entity.filter_count < 5 then
entity.filter_count = entity.filter_count + 1
end
entity.minable = {mining_time = 0.5, result = newName}
entity.collision_box = {{-0.8, -0.8}, {0.8, 0.8}}
entity.selection_box = {{-1, -1}, {1, 1}}
if wide then
entity.collision_box = {{-2.8, -0.8}, {2.8, 0.8}}
entity.selection_box = {{-3, -1}, {3, 1}}
end
local entity_performance = calculate_performance(entity, wide, forced_ips)
log(newName .. "-performance: " .. serpent.block(entity_performance))
entity.stack = false
entity.next_upgrade = nil
entity.extension_speed = entity_performance.extension_speed
entity.rotation_speed = entity_performance.extension_speed
entity.stack_size_bonus = entity_performance.stack_size_bonus
entity.energy_per_movement = entity_performance.energy_per_movement
entity.energy_per_rotation = entity_performance.energy_per_rotation
entity.pickup_position = {0.5, -1.7}
entity.insert_position = {-0.5, 1.7}
--hand
entity.hand_size = 1.5
entity.hand_base_picture = change_sprite_scale(entity.hand_base_picture, 2)
entity.hand_base_shadow = change_sprite_scale(entity.hand_base_shadow, 2)
entity.hand_closed_picture = change_sprite_scale(entity.hand_closed_picture, 1.25)
entity.hand_closed_shadow = change_sprite_scale(entity.hand_closed_shadow, 1.25)
entity.hand_open_picture = change_sprite_scale(entity.hand_open_picture, 1.5)
entity.hand_open_shadow = change_sprite_scale(entity.hand_open_shadow, 1.5)
--platform
-- if individual picures are used there is no ground texture (yet)
entity.platform_picture.north = change_sprite_scale(entity.platform_picture.north, 1.8)
entity.platform_picture.east = change_sprite_scale(entity.platform_picture.east, 1.8)
entity.platform_picture.south = change_sprite_scale(entity.platform_picture.south, 1.8)
entity.platform_picture.west = change_sprite_scale(entity.platform_picture.west, 1.8)
entity.localised_name = nil
local newSheets = {}
if entity.platform_picture.sheets then
for _, v in pairs(entity.platform_picture.sheets) do
table.insert(newSheets, change_sprite_scale(v, 1.8))
end
elseif entity.platform_picture.sheet then
newSheets = {change_sprite_scale(entity.platform_picture.sheet, 1.8)}
entity.platform_picture.sheet = nil
end
if #newSheets > 0 then
entity.platform_picture.sheets = {}
if wide then
table.insert(
entity.platform_picture.sheets,
{
filename = "__nco-InserterCranes__/graphics/ground_texture_4way.png",
priority = "extra-high",
width = 768,
height = 768,
shift = {0, 0},
scale = 0.25
}
)
end
for _, v in pairs(newSheets) do
table.insert(entity.platform_picture.sheets, v)
end
end
--log(newName .. ": " ..serpent.block(entity))
data:extend({entity})
end
return make_crane_entity