192 lines
5.3 KiB
Plaintext
192 lines
5.3 KiB
Plaintext
--[[
|
|
Dynamic Icon Layers for anomaly inventory. Used by SortingPlus and other mods by RavenAscendant.
|
|
4JUL2021
|
|
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
|
|
Author: RavenAscendant
|
|
--]]
|
|
|
|
function pr(txt, ...)
|
|
-- printf("RAXPH: "..txt, ...)
|
|
end
|
|
|
|
|
|
local iconor = aaa_rax_icon_override_mcm and true or false
|
|
local icon_override = iconor and aaa_rax_icon_override_mcm.icon_override
|
|
local ratio = utils_xml.screen_ratio()
|
|
local icon_layers = {}
|
|
|
|
--functor will be passed cell, obj and section
|
|
--functor should return table with the same info as an item section icon layer. {icon_layer = "tch_upgr_ico", icon_layer_x = 0, icon_layer_y = 1, icon_layer_scale = 0.75}
|
|
--functor can alternitivly return texture name/file, cords and dimesions {texture = "xxy.dds", x = 0, y = 0, w = 10, h = 10}
|
|
function register(name, functor)
|
|
if not name then return end -- need all three params and field really needs to be a string
|
|
|
|
if not icon_layers[name] then
|
|
icon_layers[name] = {}
|
|
end
|
|
|
|
table.insert(icon_layers[name], functor)
|
|
end
|
|
|
|
function refresh(mode) --safer way to refresh inventory, mode == 1 refreshes sorting.
|
|
local inventory = GetActorMenu()
|
|
inventory:UnHighlight_All()
|
|
if mode == 1 then
|
|
local sort = nil
|
|
for i=1,#inventory.sort_btn do
|
|
if inventory.sort_btn[i]:GetCheck() then
|
|
sort = i
|
|
end
|
|
end
|
|
inventory:On_Sort(sort or 1,false)
|
|
else
|
|
inventory:UpdateItems()
|
|
end
|
|
end
|
|
|
|
|
|
--add layers to what gets updated
|
|
local base_update = utils_ui.UICellItem.Update
|
|
|
|
function utils_ui.UICellItem:Update(obj)
|
|
obj = obj or (self.ID and level.object_by_id(self.ID))
|
|
if (self.showcase == 0) and (not obj) then
|
|
self:ResetToChild()
|
|
return false
|
|
end
|
|
|
|
local sec = self.section
|
|
local xml = self:GetXML()
|
|
|
|
if obj then
|
|
local clsid = obj:clsid()
|
|
self:Add_Layers(xml, obj, sec, clsid)
|
|
end
|
|
|
|
return base_update(self, obj)
|
|
end
|
|
|
|
|
|
local base_layers = utils_ui.UICellItem.Add_Layers
|
|
|
|
function utils_ui.UICellItem:Add_Layers(xml, obj, sec, clsid)
|
|
base_layers(self, xml, obj, sec, clsid)
|
|
|
|
local ii = 1
|
|
while ((iconor and icon_override:section_exist(sec) and icon_override:r_string_ex(sec,(ii).."icon_layer")) or SYS_GetParam(0, sec, (ii).."icon_layer") ~= nil) do --get ii up to next avail layer.
|
|
ii = ii + 1
|
|
end
|
|
if (not self.layer) then
|
|
self.layer = {}
|
|
end
|
|
for key, name in pairs(icon_layers) do
|
|
for _, functor in pairs(name) do
|
|
if (not self.layer[ii]) then
|
|
if (not xml) then
|
|
xml = self:GetXML()
|
|
end
|
|
self.layer[ii] = xml:InitStatic(self.path .. ":" .. self.cx .. ":pic", self.ico)
|
|
end
|
|
|
|
local tbl = functor and functor(self, obj, sec)
|
|
if tbl then
|
|
if tbl.icon_layer then
|
|
add_icon_layer(self, self.layer[ii], self.ico, sec, tbl)
|
|
ii = ii + 1
|
|
end
|
|
if tbl.texture then
|
|
add_texture_layer(self,self.layer[ii], self.ico, sec, tbl)
|
|
ii = ii + 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function add_icon_layer(self,ele, base, sec_m, tbl)
|
|
local sec_l = tbl.icon_layer
|
|
local grid_size = self.grid_size
|
|
local x = tbl.icon_layer_x or 0
|
|
local y = tbl.icon_layer_y or 0
|
|
local axis = utils_xml.get_item_axis(sec_l, grid_size)
|
|
local w = axis.w
|
|
local h = axis.h
|
|
local scale = tbl.icon_layer_scale or 1
|
|
local scale_pos = scale * (grid_size/50)
|
|
|
|
local rot = ele:GetHeading() > 0
|
|
local x_s = x * ratio * scale_pos
|
|
local y_s = y * scale_pos
|
|
local w_s = w * ratio * scale
|
|
local h_s = h * scale
|
|
local w_off = (w_s/2)
|
|
local h_off = (h_s/2)
|
|
|
|
if rot then
|
|
-- despite rotation, movement for x and y stays normal!
|
|
-- Move start pos to match the one for rotated base icon
|
|
local w_b, h_b = base:GetWidth(), base:GetHeight()
|
|
local x_st = (w_b/2) - (h_b/2)
|
|
local y_st = h_b + x_st
|
|
|
|
-- On 90 rotation, x and y are inverted, y axis goes negative simulate normal x movement
|
|
x_s = x_st + (y * ratio * scale_pos)
|
|
y_s = y_st - (x * scale_pos)
|
|
w_s = w * scale
|
|
h_s = h * scale
|
|
w_off = (h_s - h_s *ratio/2)
|
|
h_off = -w_s/2
|
|
end
|
|
|
|
ele:InitTexture( utils_xml.get_icons_texture(sec_l) )
|
|
ele:SetTextureRect(Frect():set( utils_xml.get_item_axis(sec_l, nil, true) ))
|
|
ele:SetStretchTexture(true)
|
|
ele:SetWndPos(vector2():set( x_s + w_off , y_s + h_off ))
|
|
ele:SetWndSize(vector2():set( w_s , h_s ))
|
|
ele:Show(true)
|
|
|
|
|
|
|
|
end
|
|
|
|
function add_texture_layer(self,ele, base, sec_m, tbl)
|
|
local grid_size = self.grid_size
|
|
local x = tbl.x or 0
|
|
local y = tbl.y or 0
|
|
local w = tbl.w
|
|
local h = tbl.h
|
|
local scale = 1
|
|
local scale_pos = scale * (grid_size/50)
|
|
|
|
local rot = ele:GetHeading() > 0
|
|
local x_s = x * ratio * scale_pos
|
|
local y_s = y * scale_pos
|
|
local w_s = w * ratio * scale
|
|
local h_s = h * scale
|
|
local w_off = (w_s/2)
|
|
local h_off = (h_s/2)
|
|
|
|
if rot then
|
|
-- despite rotation, movement for x and y stays normal!
|
|
-- Move start pos to match the one for rotated base icon
|
|
local w_b, h_b = base:GetWidth(), base:GetHeight()
|
|
local x_st = (w_b/2) - (h_b/2)
|
|
local y_st = h_b + x_st
|
|
|
|
-- On 90 rotation, x and y are inverted, y axis goes negative simulate normal x movement
|
|
x_s = x_st + (y * ratio * scale_pos)
|
|
y_s = y_st - (x * scale_pos)
|
|
w_s = w * scale
|
|
h_s = h * scale
|
|
w_off = (h_s - h_s *ratio/2)
|
|
h_off = -w_s/2
|
|
end
|
|
|
|
ele:InitTexture( tbl.texture )
|
|
ele:SetStretchTexture(true)
|
|
ele:SetWndPos(vector2():set( x_s + w_off , y_s + h_off ))
|
|
ele:SetWndSize(vector2():set( w_s , h_s ))
|
|
ele:Show(true)
|
|
end
|