Aleksei-bird 7c9c708c92 Первый фикс
Пачки некоторых позиций увеличены
2024-03-01 20:54:33 +03:00

160 lines
5.2 KiB
Lua

local minime = require("__minime_temp__/common")("minime_temp")
-- Get scale factor and convert from percent to fraction
local scale_factor = settings.startup["minime_character-size"].value/100
-- Apply scale_factor to both parts of a vector or position. We don't want
-- to mess with other mods, so we return the scaled position in the original
-- format (dictionary: {x = 1, y = 1}, or array: {1, 1}).
local function scale_position(position, hr)
-- Make sure position is in correct format
position = position or { x = 0, y = 0}
if type(position) ~= "table" or table_size(position) ~= 2 then
error(serpent.line(position) .. " is not a valid position!")
end
-- Is this for the HR version?
hr = hr and 1/scale_factor or 1
local x = (position.x or position[1]) * scale_factor * hr
local y = (position.y or position[2]) * scale_factor * hr
return (position.x and position.y) and { x = x, y = y} or {x, y}
end
local function scale_image(img)
if not img.scaled then
-- Set scale (defaults to 1 if not explicitly set)
img.scale = (img.scale or 1) * scale_factor
minime.dprint("Scaled image " .. tostring(img.filename))
if img.hr_version then
img.hr_version.scale = (img.hr_version.scale or 1) * scale_factor
minime.dprint("Scaled HR image " .. tostring(img.hr_version.filename))
end
-- Set shift
img.shift = scale_position(img.shift)
if img.hr_version then
img.hr_version.shift = scale_position(img.shift, "HR")
end
-- Mark picture as scaled -- otherwise it will be scaled each time it's used!
img.scaled = true
end
end
local function recurse(table)
for p, picture in pairs(table) do
minime.dprint("p: " .. tostring(p))
if type(picture) == "table" then
if picture.filename then
scale_image(picture)
else
recurse(picture)
end
else
minime.dprint("Deadend! No picture: " .. serpent.line(picture))
end
end
end
--------------------------------------------------------------------------------
-- Change corpses
--------------------------------------------------------------------------------
for c, corpse in pairs(data.raw["character-corpse"]) do
minime.dprint("Scaling corpse " .. tostring(corpse.name) .. " (factor: " .. scale_factor .. ")")
-- Adjust size of different boxes
local box = corpse.selection_box
if box then
corpse.selection_box = { scale_position(box[1]), scale_position(box[2]) }
end
if corpse.picture then
minime.dprint("Found \"picture\"!")
recurse(corpse.picture)
end
if corpse.pictures then
minime.dprint("Found \"pictures\"!")
recurse(corpse.pictures)
end
end
-- animation_list contains the names of mandatory+optional animations.
-- There's another property (armors), and other mods may add their own private properties,
-- so using a list instead of iterating through all values we find will be safer.
local animation_list = {
"idle",
"idle_with_gun",
"running",
"running_with_gun",
"mining_with_tool",
"flipped_shadow_running_with_gun"
}
--------------------------------------------------------------------------------
-- Change characters
--------------------------------------------------------------------------------
-- Scale characters' mining reach along with their graphics?
local mining_distance = settings.startup["minime_scale-reach_resource_distance"].value
-- Scale characters' tool-attack distance along with their graphics?
local tool_attack_distance = settings.startup["minime_scale-tool-attack-distance"].value
for c, character in pairs(data.raw["character"]) do
minime.dprint("Scaling character " .. tostring(character.name) .. " (factor: " .. scale_factor .. ")")
-- Adjust size of different boxes
local box = character.selection_box
if box then
character.selection_box = { scale_position(box[1]), scale_position(box[2]) }
end
box = character.sticker_box
if box then
character.sticker_box = { scale_position(box[1]), scale_position(box[2]) }
end
-- Collision box of character should always be minimal so we can move it everywhere!
character.collision_box = {{-0.1, -0.1}, {0.1, 0.1}}
-- Scale mining reach
if mining_distance then
character.reach_resource_distance = character.reach_resource_distance * scale_factor
minime.dprint("Scaled reach_resource_distance of " .. character.name .. " to " ..
character.reach_resource_distance)
end
-- Scale tool-attack distance
if tool_attack_distance then
character.tool_attack_distance = (character.tool_attack_distance or 1.5) * scale_factor
minime.dprint("Scaled tool_attack_distance of " .. character.name .. " to " ..
character.tool_attack_distance .. " (Default: " ..
character.tool_attack_distance/scale_factor .. ")")
end
-- Apply scale_factor to character graphics
for _, armor_level in ipairs(character.animations) do
for a, animation in pairs(animation_list) do
animation = armor_level[animation] or {}
for p, picture in ipairs(animation.layers or {}) do
scale_image(picture)
end
end
end
-- Apply scale factor to character.corpse, if it exists
if character.corpse then
recurse(data.raw["corpse"][character.corpse])
end
end