Divergent/mods/Maid's Vanilla HD Icons/gamedata/scripts/aaa_rax_icon_override_mcm.s...

844 lines
27 KiB
Plaintext
Raw Normal View History

2024-03-17 20:18:03 -04:00
--[[
Icon Override
18OCT2021
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
Author: RavenAscendant
Provide a location to specifiy alternitive item icons that should be less prone to conflicts
covers icons(icons_texture, inv_grid_x,inv_grid_y,inv_grid_width,inv_grid_height),
icon layers (1icon_layer,1icon_layer_scale, 1icon_layer_x, 1icon_layer_y ),
and upgrade icons (upgr_icon_path, upgr_icon_width, upgr_icon_height).
This script does not make an MCM menu. It leerages MCM to load early enough to modify the New Game screens.
--]]
local ratio = utils_xml.screen_ratio()
icon_override = ini_file_ex("icon_override\\icon_override.ltx")
function print_dbg( text , ...)
if false then
printf( "RAX: | %s | "..text ,time_global(), ...)
end
end
local clr_icon_1 = GetARGB(255, 255, 255, 255)
local clr_icon_2 = GetARGB(70, 255, 255, 255)
local ico_size, rw, rh, _le = 0.7,1,1,50
local ico_width
local clr_list = {
["def"] = GetARGB(255, 255, 255, 255),
["red"] = GetARGB(255, 255, 50, 50),
["green"] = GetARGB(255, 100, 255, 150),
["blue"] = GetARGB(255, 100, 150, 255),
["black"] = GetARGB(255, 0, 0, 0),
["drag"] = GetARGB(150, 255, 255, 255),
["hide"] = GetARGB(70, 255, 255, 255),
["shadow"] = GetARGB(200, 20, 20, 20),
["hide_shadow"] = GetARGB(70, 20, 20, 20),
["p1"] = GetARGB(255, 170, 170, 170),
["n1"] = GetARGB(255, 200, 50, 50),
["p2"] = GetARGB(255, 51, 255, 102),
["n2"] = GetARGB(255, 204, 0, 51),
["info_def"] = GetARGB(200, 255, 255, 255),
["info_p"] = GetARGB(255, 56, 209, 115),
["info_n"] = GetARGB(255, 238, 28, 36),
["info_p_txt"] = GetARGB(200, 100, 255, 100),
["info_n_txt"] = GetARGB(200, 255, 100, 100),
}
local clr_list_hl = {
["def"] = GetARGB(25, 255, 255, 255),
["green"] = GetARGB(30, 100, 255, 150),
["blue"] = GetARGB(40, 100, 200, 255),
}
function utils_xml.get_icons_texture(section)
return section and (icon_override:section_exist(section) and icon_override:r_string_ex(section,"icons_texture") or ini_sys:r_string_ex(section,"icons_texture")) or "ui\\ui_icon_equipment"
end
function utils_xml.get_item_axis(section, grid_size, unpacked)
-- Rule: get item axis out of info from its section
-- Input: section of the target item (string)
-- Output: table of item's axis (x1, y1, x2, y2, width, height)
grid_size = grid_size or 50
--print_dbg("axis %s %s %s %s %s", section, icon_override:section_exist(section) and icon_override:r_float_ex(section,"inv_grid_x") ,icon_override:section_exist(section) and icon_override:r_float_ex(section,"inv_grid_y") ,icon_override:section_exist(section) and icon_override:r_float_ex(section,"inv_grid_width") , icon_override:section_exist(section) and icon_override:r_float_ex(section,"inv_grid_height"))
local inv_grid_x = icon_override:section_exist(section) and icon_override:r_float_ex(section,"inv_grid_x") or ini_sys:r_float_ex(section,"inv_grid_x") or 0
local inv_grid_y = icon_override:section_exist(section) and icon_override:r_float_ex(section,"inv_grid_y") or ini_sys:r_float_ex(section,"inv_grid_y") or 0
local inv_grid_width = icon_override:section_exist(section) and icon_override:r_float_ex(section,"inv_grid_width") or ini_sys:r_float_ex(section,"inv_grid_width") or 0
local inv_grid_height = icon_override:section_exist(section) and icon_override:r_float_ex(section,"inv_grid_height") or ini_sys:r_float_ex(section,"inv_grid_height") or 0
local x1 = inv_grid_x * grid_size
local y1 = inv_grid_y * grid_size
local w = inv_grid_width * grid_size
local h = inv_grid_height * grid_size
local x2 = x1 + w
local y2 = y1 + h
if unpacked then
return x1, y1, x2, y2
end
return { x1=x1, y1=y1, x2=x2, y2=y2, w=w, h=h }
end
local upgr_chk = {
["weapon"] = {
{ x = 1724 , y = 802 , w = 167 , h = 159 }
},
["outfit"] = {
{ x = 716 , y = 824 , w = 198 , h = 129 },
{ x = 814 , y = 579 , w = 159 , h = 137 },
{ x = 90 , y = 818 , w = 185 , h = 140 }
},
}
function utils_xml.set_upgr_icon(obj, sec, XML_box, XML_temp)
ico_width = ico_width or utils_xml.screen_ratio()
local upgr_x = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"upgr_icon_x") or ini_sys:r_float_ex(sec,"upgr_icon_x")
local upgr_y = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"upgr_icon_y") or ini_sys:r_float_ex(sec,"upgr_icon_y")
local upgr_w = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"upgr_icon_width") or ini_sys:r_float_ex(sec,"upgr_icon_width")
local upgr_h = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"upgr_icon_height") or ini_sys:r_float_ex(sec,"upgr_icon_height")
if not (upgr_x and upgr_y and upgr_w and upgr_h) then
utils_xml.set_icon(sec, nil, XML_temp, XML_box)
return
end
-- Get upgrade dds
local overide_path = icon_override:section_exist(sec) and icon_override:r_string_ex(sec,"upgr_icon_path")
local upgr_path = ini_sys:r_string_ex(sec,"upgr_icon_path")
upgr_path = overide_path or upgr_path or IsWeapon(obj) and "ui\\ui_actor_weapons" or "ui\\ui_actor_armor"
-- Decide if it should use normal icon instead
local use_ico = false
local t = {}
if not overide_path then
if IsWeapon(obj) then
for i=1,#upgr_chk["weapon"] do
t = upgr_chk["weapon"][i]
if (t.x == upgr_x) and (t.y == upgr_y) and (t.w == upgr_w) and (t.h == upgr_h) then
use_ico = true
break
end
end
elseif IsOutfit(obj) then
for i=1,#upgr_chk["outfit"] do
t = upgr_chk["outfit"][i]
if (t.x == upgr_x) and (t.y == upgr_y) and (t.w == upgr_w) and (t.h == upgr_h) then
use_ico = true
break
end
end
end
end
if use_ico then
utils_xml.set_icon(sec, nil, XML_temp, XML_box)
return
end
local ico = {}
ico.x1 = upgr_x
ico.y1 = upgr_y
ico.x2 = upgr_x + upgr_w
ico.y2 = upgr_y + upgr_h
ico.w = upgr_w
ico.h = upgr_h
XML_box:InitTexture(upgr_path)
XML_box:SetTextureRect(Frect():set(ico.x1, ico.y1, ico.x2, ico.y2))
XML_box:SetStretchTexture(true)
XML_box:Show(true)
local pos = XML_temp:GetWndPos()
local _w = XML_temp:GetWidth()
local _h = XML_temp:GetHeight()
local ratio = ico.w/ico.h
local h, w
ico.w = ico.w * ico_size * ico_width
ico.h = ico.h * ico_size
for i=1,2 do
local w_t, h_t = 0, 0
local resize = false
if (ico.w > _w) then -- if icon width is bigger than frame width
w_t = ico.w - _w
resize = true
end
if (ico.h > _h) then -- if icon height is bigger than frame height
h_t = ico.h - _h
resize = true
end
if resize then -- resize is required
if (w_t >= h_t) then -- if icon width is the big number (or square), use it as a base for resizing
w = _w
h = w / ratio
elseif (w_t < h_t) then -- if icon width is the big number, use it as a base for resizing
h = _h
w = h * ratio
end
else -- no resize
w = ico.w
h = ico.h
end
end
local offset_x = (_w - w)/2
local offset_y = (_h - h)/2
XML_box:SetWndSize(vector2():set(w , h))
XML_box:SetWndPos(vector2():set(pos.x + offset_x , pos.y + offset_y))
end
--utils_ui.get_item_axis = utils_xml.get_item_axis
local sync_element = utils_xml.sync_element
function utils_ui.UICellItem:Set(obj, area)
local ratio = utils_xml.screen_ratio()
local xml = self:GetXML()
local path = self.path
local is_obj = (self.showcase == 0)
local grid_size = self.grid_size
local sec = is_obj and obj:section() or obj
local clsid = is_obj and obj:clsid()
local x = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"inv_grid_x") or SYS_GetParam(2,sec, "inv_grid_x")
local y = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"inv_grid_y") or SYS_GetParam(2,sec, "inv_grid_y")
local w = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"inv_grid_width") or SYS_GetParam(2,sec, "inv_grid_width")
local h = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"inv_grid_height") or SYS_GetParam(2,sec, "inv_grid_height")
if not x or not y or not w or not h then
return false
end
x = x * grid_size
y = y * grid_size
w = w * grid_size
h = h * grid_size
self.ID = is_obj and obj:id() or nil
self.section = sec
self.area = area
--self.X = x
--self.Y = y
self.W = w
self.H = h
-- Trade mode
--if self:Check_TradeMode(obj, sec) then
--return false
--end
-- Cell pos
if area and (not self.manual) then
local area_x = ((area.x * grid_size) - grid_size) * ratio
local area_y = (area.y * grid_size) - grid_size
local area_xl = self.grid_line * area.x
local area_yl = self.grid_line * area.y
self.cell:SetWndPos(vector2():set( area_x + area_xl , area_y + area_yl ))
self.cell:SetWndSize(vector2():set(w * ratio , h))
sync_element(self.hl, self.cell)
self:Print(nil, "Set for [%s] in (%s,%s,%s,%s)", sec, area_x, area_y, w, h)
-- Cell pos (free cell)
elseif self.st then
local st_x = ((self.st:GetWidth() /2) - ((w * ratio) /2))
local st_y = ((self.st:GetHeight() /2) - (h /2))
self.cell:SetWndPos(vector2():set( st_x , st_y ))
self.cell:SetWndSize(vector2():set(w * ratio , h))
sync_element(self.hl, self.cell)
self:Print(nil, "Set for [%s] in free cell", sec)
end
-- Icon
self:Add_Icon(sec, w, h)
self:Add_Shadow(sec, w, h)
-- Icon layers
self:Add_Layers(xml, obj, sec, clsid)
-- Update cell
local is_updated = self:Update(is_obj and obj)
if (not is_updated) then
self:Print(nil, "Updating failed for [%s] | Reset cell", sec)
self:Reset()
return false
end
self.cell:Show(true)
return true
end
function utils_ui.UICellItem:Add_Icon(sec, w, h)
local rot = self.ico:GetHeading() > 0
self.ico:InitTexture( utils_xml.get_icons_texture(sec) )
self.ico:SetTextureRect(Frect():set( utils_xml.get_item_axis(sec, nil, true) ))
self.ico:SetStretchTexture(true)
self.ico:SetWndSize(vector2():set( w * (rot and 1 or ratio) , h ))
self.ico:Show(true)
utils_xml.align_to_center(self.ico, self.cell)
self:Print(nil, "Show icon")
end
function utils_ui.UICellItem:Add_Shadow(sec, w, h)
local rot = self.shadow:GetHeading() > 0
self.shadow:InitTexture( utils_xml.get_icons_texture(sec) )
self.shadow:SetTextureRect(Frect():set( utils_xml.get_item_axis(sec, nil, true) ))
self.shadow:SetStretchTexture(true)
self.shadow:SetWndSize(vector2():set( w * (rot and 1 or ratio) , h ))
self.shadow:Show(true)
self.shadow:Show(true)
utils_xml.align_to_center(self.shadow, self.cell)
local pos = self.ico:GetWndPos()
self.shadow:SetWndPos( vector2():set( pos.x + 1 , pos.y + 2 ) )
self.shadow:SetTextureColor( clr_list["shadow"] )
self:Print(nil, "Show shadow")
end
function utils_ui.UICellContainer:SetGridSpecs(size, line)
self.grid_size = size or self.grid_size
self.grid_line = line or self.grid_line
self.cols = math.floor( (self.scroll:GetWidth() ) / (self.grid_size * ratio + self.grid_line) )
self:Print(nil, "SetGridSpecs | size: %s - line: %s - num of colomns: %s", self.grid_size, self.grid_line, self.cols)
end
function utils_ui.UICellItem:Create_Layer(ele, base, sec_m, sec_l, str_x, str_y, str_scale)
local ratio = utils_xml.screen_ratio()
local grid_size = self.grid_size
local x = str_x and (icon_override:section_exist(sec_m) and icon_override:r_float_ex(sec_m,str_x) or SYS_GetParam(2,sec_m, str_x)) or 0
local y = str_y and (icon_override:section_exist(sec_m) and icon_override:r_float_ex(sec_m,str_y) or SYS_GetParam(2,sec_m, str_y)) or 0
local w = (icon_override:section_exist(sec_l) and icon_override:r_float_ex(sec_l,"inv_grid_width") or SYS_GetParam(2,sec_l, "inv_grid_width",1)) * grid_size
local h = (icon_override:section_exist(sec_l) and icon_override:r_float_ex(sec_l,"inv_grid_height") or SYS_GetParam(2,sec_l, "inv_grid_height",1)) * grid_size
local scale = str_scale and (icon_override:section_exist(sec_m) and icon_override:r_float_ex(sec_m,str_scale) or SYS_GetParam(2,sec_m, str_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)*ratio
local y_st = (w_b/2) + (h_b/2)
--printf("w:%s,h:%s, y:%s,x:%s",w_b, h_b, y_st,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* 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 utils_ui.UICellItem:Add_Layers(xml, obj, sec, clsid)
local ratio = utils_xml.screen_ratio()
-- Hide all layers
if self.layer then
for i=1,#self.layer do
self.layer[i]:Show(false)
end
end
-- Add all possible layers
local ii = 0
while (icon_override:section_exist(sec) and icon_override:r_string_ex(sec,(ii+1).."icon_layer") or SYS_GetParam(0, sec, (ii+1).."icon_layer") ~= nil) do
ii = ii + 1
if (not self.layer) then
self.layer = {}
end
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 icon_layer = icon_override:section_exist(sec) and icon_override:r_string_ex(sec,ii.."icon_layer") or SYS_GetParam(0, sec, ii.."icon_layer")
self:Create_Layer(self.layer[ii], self.ico, sec, icon_layer, ii.."icon_layer_x", ii.."icon_layer_y", ii.."icon_layer_scale")
self:Print(nil, "Show layer (%s) [%s]", ii, icon_layer)
end
end
local clr_icon_1 = GetARGB(255, 255, 255, 255)
local clr_icon_2 = GetARGB(70, 255, 255, 255)
local ico_size, rw, rh, _le = 0.7,1,1,50
local ico_width
function utils_xml.set_icon(sec, hidden, XML_temp, XML_box, XML_box_small)
ico_width = ico_width or ico_width or utils_xml.screen_ratio()
if not (XML_temp and XML_box) then
callstack()
printe("!ERROR utils_xml.set_icon | XML_box or XML_temp doesn't exist")
return
end
if not (sec and ini_sys:section_exist(sec)) then
XML_box:Show(false)
callstack()
printe("!ERROR utils_xml.set_icon | section [%s] doesn't exist in system ini", sec)
return
end
-- Icon
local ico = utils_xml.get_item_axis(sec)
XML_box:InitTexture( utils_xml.get_icons_texture(sec) )
XML_box:SetTextureRect(Frect():set(ico.x1, ico.y1, ico.x2, ico.y2))
XML_box:SetTextureColor( hidden and clr_icon_2 or clr_icon_1 )
XML_box:SetStretchTexture(true)
XML_box:Show(true)
local pos = XML_temp:GetWndPos()
local _w = XML_temp:GetWidth()
local _h = XML_temp:GetHeight()
local h, w
ico.w = ico.w * ico_size * ico_width
ico.h = ico.h * ico_size
local ratio = ico.w/ico.h
for i=1,2 do
local w_t, h_t = 0, 0
local resize = false
if (ico.w > _w) then -- if icon width is bigger than frame width
w_t = ico.w - _w
resize = true
end
if (ico.h > _h) then -- if icon height is bigger than frame height
h_t = ico.h - _h
resize = true
end
if resize then -- resize is required
if (w_t >= h_t) then -- if icon width is the big number (or square), use it as a base for resizing
w = _w
h = w / ratio
elseif (w_t < h_t) then -- if icon width is the big number, use it as a base for resizing
h = _h
w = h * ratio
end
else -- no resize
w = ico.w
h = ico.h
end
end
local offset_x = (_w - w)/2
local offset_y = (_h - h)/2
XML_box:SetWndSize(vector2():set(w , h))
XML_box:SetWndPos(vector2():set(pos.x + offset_x , pos.y + offset_y))
local ico_layer = icon_override:section_exist(sec) and icon_override:r_string_ex(sec,"1icon_layer") or ini_sys:r_string_ex(sec,"1icon_layer")
if XML_box_small and ico_layer then
local ico_layer_x = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"1icon_layer_x") or ini_sys:r_float_ex(sec,"1icon_layer_x")
local ico_layer_y = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"1icon_layer_y") or ini_sys:r_float_ex(sec,"1icon_layer_y")
local ico_layer_scale = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"1icon_layer_scale") or ini_sys:r_float_ex(sec,"1icon_layer_scale")
if (ico_layer_x == 0) and (ico_layer_y == 0) and (ico_layer_scale == 1) then
utils_xml.set_icon(ico_layer, hidden, XML_temp, XML_box_small)
end
end
end
function utils_ui.UICellContainer:On_Drag(idx, tg, set)
-- Hold icon should be declared after everything else, so it stays on top
-- Also it must be assigned on the base UI because we need x and y to start from absolute screen corner
if (not self.hold.ico) then
self.hold.ico = self.xml:InitStatic(self.path .. ":cell:pic", self.owner)
self.hold.ico:Show(false)
end
if (self.disable_drag) then
return
end
-- Drag start / Drop
if set then
self:Print(nil, "Drag | hold_idx: %s - hold_tg: %s", idx, tg)
-- Callback
if (not idx) and self.hold.idx and (self.hold.idx ~= self.hover.idx) then -- IF released mouse + drag item is captured + drag item is not hovered item
self:Callback( "On_CC_DragDrop", self.ID, self.hold.idx )
end
-- Useful to prevent some actions for owner when there's a dragged item, by checking on (self.item_in_hold)
if self.owner.item_in_hold == self.ID then
self.owner.item_in_hold = false
end
if idx then
self.owner.item_in_hold = self.ID
-- Hold the scroll and stop moving on dragging
self.scroll_pos = self.scroll:GetCurrentScrollPos()
-- No point of holding empty cells
if (not self.cell[idx]:IsShown()) then
return
end
end
self.hold.idx = idx
self.hold.tg = tg
self.hold.ico:Show(false)
return
end
-- Drag
if self.hold.idx and tg - self.hold.tg > 100 then
-- Set up drag item icon
if (not self.hold.ico:IsShown()) then
self:Print(nil, "Drag | set up icon")
local sec = self.cell[self.hold.idx].section
if sec then
self.hold.w = (icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"inv_grid_width") or SYS_GetParam(2,sec, "inv_grid_width") )* self.grid_size * ratio
self.hold.h = (icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"inv_grid_height") or SYS_GetParam(2,sec, "inv_grid_height")) * self.grid_size
self.hold.ico:InitTexture( utils_xml.get_icons_texture(sec) )
self.hold.ico:SetTextureRect(Frect():set( utils_xml.get_item_axis(sec, nil, true) ))
self.hold.ico:SetTextureColor( clr_list["drag"] )
self.hold.ico:SetStretchTexture(true)
self.hold.ico:SetWndSize(vector2():set(self.hold.w , self.hold.h))
self.hold.ico:Show(true)
end
end
-- Sync with cursor pos
local pos = GetCursorPosition()
self.hold.ico:SetWndPos( pos )
end
end
local has_upgrades = utils_item.has_upgrades
local sync_element = utils_xml.sync_element
local sync_cursor = utils_xml.sync_cursor
local get_item_axis = utils_xml.get_item_axis
local get_item_trade_status = utils_item.get_item_trade_status
local get_item_cost = utils_item.get_item_cost
local lerp_color = utils_xml.lerp_color
-- Item order
local item_order = {}
function set_item_order()
local n = ini_sys:line_count("item_kind_order")
for i=0,n-1 do
local result, kind, order = ini_sys:r_line_ex("item_kind_order",i,"","")
if kind and order then
item_order[kind] = tonumber(order) or 30
end
end
item_order["na"] = size_table(item_order) + 1
end
set_item_order()
local ab_w, ab_h, ab_k = {}, {}, {}
local a_sec, a_w, a_h, a_k
local b_sec, b_w, b_h, b_k
function sort_info(asec, bsec)
-- A
a_sec = asec
axis = utils_xml.get_item_axis(a_sec,1)
if (not ab_w[a_sec]) then ab_w[a_sec] = axis.w end
if (not ab_h[a_sec]) then ab_h[a_sec] = axis.h end
if (not ab_k[a_sec]) then
ab_k[a_sec] = SYS_GetParam(0,a_sec,"kind","na")
if (not item_order[ab_k[a_sec]]) then
ab_k[a_sec] = "na"
end
end
a_w = ab_w[a_sec]
a_h = ab_h[a_sec]
a_k = item_order[ab_k[a_sec]]
-- B
b_sec = bsec
axis = utils_xml.get_item_axis(b_sec,1)
if (not ab_w[b_sec]) then ab_w[b_sec] = axis.w end
if (not ab_h[b_sec]) then ab_h[b_sec] = axis.h end
if (not ab_k[b_sec]) then
ab_k[b_sec] = SYS_GetParam(0,b_sec,"kind","na")
if (not item_order[ab_k[b_sec]]) then
ab_k[b_sec] = "na"
end
end
b_w = ab_w[b_sec]
b_h = ab_h[b_sec]
b_k = item_order[ab_k[b_sec]]
end
function sort_by_size(t,a,b)
if (type(t[a]) == "string") then
sort_info(t[a], t[b])
else
sort_info(t[a]:section(), t[b]:section())
end
-- Comparison
--printf("%s - %s", a_sec, b_sec)
if (a_w == b_w) then
if (a_h == b_h) then
if (a_sec == b_sec) then
if (type(t[a]) == "string") then
return false --true
end
return t[a]:id() > t[b]:id()
end
return a_sec < b_sec -- alphaptic order
end
return a_h > b_h
end
return a_w > b_w
end
function sort_by_kind(t,a,b)
if (type(t[a]) == "string") then
sort_info(t[a], t[b])
else
sort_info(t[a]:section(), t[b]:section())
end
if a_k == b_k then
return sort_by_size(t,a,b)
end
return a_k < b_k
end
function sort_by_index(t,a,b)
return t[a].index < t[b].index
end
function sort_by_sizekind(t,a,b)
if (type(t[a]) == "string") then
sort_info(t[a], t[b])
else
sort_info(t[a]:section(), t[b]:section())
end
-- Comparison
--printf("%s - %s", a_sec, b_sec)
--\\ bigger width wins
if (a_w == b_w) then
--\\ bigger height wins
if (a_h == b_h) then
--\\ important kind wins
if a_k == b_k then
--\\ alphaptic order wins
if (a_sec == b_sec) then
--\\ better condition wins
if (type(t[a]) == "string") then
return false --true
end
return t[a]:condition() > t[b]:condition()
end
return a_sec < b_sec
end
return a_k < b_k
end
return a_h > b_h
end
return a_w > b_w
end
function sort_by_props(t,a,b)
-- Only for objects with same sections
local sec = t[a]:section()
-- For ammo, bigger ammo counts wins
if IsItem("ammo",sec) and (not IsItem("grenade_ammo",sec)) then
return t[a]:ammo_get_count() > t[b]:ammo_get_count()
-- Upgraded items wins
elseif utils_item.has_upgrades(t[a]) and (not utils_item.has_upgrades(t[b])) then
return true
end
-- Better condition wins
return t[a]:condition() > t[b]:condition()
end
utils_ui.sort_by_props = sort_by_props
utils_ui.sort_by_sizekind = sort_by_sizekind
utils_ui.sort_by_index = sort_by_index
utils_ui.sort_by_kind = sort_by_kind
utils_ui.sort_by_size = sort_by_size
utils_ui.sort_info = sort_info
function utils_ui.UICellContainer:FindFreeCell(obj, sec)
if (not sec) then
if (not obj) then
return false
end
sec = obj and obj:section()
end
local w = (icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"inv_grid_width") or SYS_GetParam(2,sec, "inv_grid_width", 1) )
local h = (icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"inv_grid_height") or SYS_GetParam(2,sec, "inv_grid_height", 1))
-- Avoid icons that don't fit
if w > self.cols then
return false
end
-- Sorting by kind: when sorting a new kind, always start from last row taken by previous kind
if self.sort_method == "kind" then
self.rKind.current = item_order[ab_k[sec] ]
if (self.rKind.last ~= self.rKind.current) then
local cnt = self.line_cnt + 1
if (not self.line[cnt]) then
self.line[cnt] = self.xml:InitStatic(self.path .. ":line", self.st)
end
local y = (self.row_end) * (self.grid_size + self.grid_line)
self.line[cnt]:SetWndPos( vector2():set(0,y - 2.5) )
self.line[cnt]:SetWndSize( vector2():set(self.prof:GetWidth(),6) )
self.line[cnt]:Show(true)
self.line_cnt = cnt
self.rKind.last = self.rKind.current
self.rKind.row = self.row_end + 1
end
end
local row_s = self.rKind.row
local rows = #self.grid
local cols = self.cols + 1 - w
self:Print(nil, "FindFreeCell for [%s] (rows: %s, cols: %s, W: %s, H: %s)", sec, rows,cols,w,h)
for r=row_s, rows do
for c=1,cols do
if self:IsFreeRoom(r,c,w,h) then
return self:TakeRoom(r,c,w,h)
end
end
end
self:Grow()
return self:FindFreeCell(obj, sec)
end
function item_artefact.UIBelt:Refresh()
local cnt = 0
self:Clear()
if not main_hud_shown() then
return
end
db.actor:iterate_belt( function(owner, obj)
local sec = obj:section()
cnt = cnt + 1
self.slot[cnt].ico:InitTexture( utils_xml.get_icons_texture(sec) )
self.slot[cnt].ico:SetTextureRect(Frect():set( utils_xml.get_item_axis(sec, nil, true) ))
self.slot[cnt].ico:Show(true)
-- Set up indicator icon if found
local ico_layer = icon_override:section_exist(sec) and icon_override:r_string_ex(sec,"1icon_layer") or ini_sys:r_string_ex(sec,"1icon_layer")
if ico_layer then
local ico_layer_x = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"1icon_layer_x") or ini_sys:r_float_ex(sec,"1icon_layer_x")
local ico_layer_y = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"1icon_layer_y") or ini_sys:r_float_ex(sec,"1icon_layer_y")
local ico_layer_scale = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"1icon_layer_scale") or ini_sys:r_float_ex(sec,"1icon_layer_scale")
local pos = self.slot[cnt].ico:GetWndPos()
local w = self.slot[cnt].ico:GetWidth()
local h = self.slot[cnt].ico:GetHeight()
local ratio = w/50
--print_dbg("UIBelt: icon [%s](%s) | x = %s / y = %s / w = %s / h = %s", sec, cnt, pos.x , pos.y , w , h )
local x_i = pos.x + math.ceil(ico_layer_x * ico_layer_scale * ratio)
local y_i = pos.y + math.ceil(ico_layer_y * ico_layer_scale * ratio)
local w_i = math.ceil(w * ico_layer_scale)
local h_i = math.ceil(h * ico_layer_scale)
self.slot[cnt].layer:InitTexture( utils_xml.get_icons_texture(ico_layer) )
self.slot[cnt].layer:SetWndPos(vector2():set( x_i , y_i ))
self.slot[cnt].layer:SetWndSize(vector2():set( w_i , h_i ))
--print_dbg("UIBelt: indicator [%s](%s) | scale: %s / x = %s / y = %s / w = %s / h = %s", sec, cnt, ico_layer_scale, x_i , y_i , w_i , h_i )
self.slot[cnt].layer:SetTextureRect(Frect():set( utils_xml.get_item_axis(ico_layer, nil, true) ))
self.slot[cnt].layer:Show(true)
end
end)
self.dialog:Show(cnt > 0)
end
function ui_inventory.UIInventory:RMode_InitItemIcon(obj)
self:Print(nil, "RMode_InitItemIcon | %s", obj and obj:name())
if (not obj) then
self.npc_up_item:Show(false)
return
end
local sec = obj:section()
local x = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"upgr_icon_x") or ini_sys:r_float_ex(sec,"upgr_icon_x")
local y = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"upgr_icon_y") or ini_sys:r_float_ex(sec,"upgr_icon_y")
local w = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"upgr_icon_width") or ini_sys:r_float_ex(sec,"upgr_icon_width")
local h = icon_override:section_exist(sec) and icon_override:r_float_ex(sec,"upgr_icon_height") or ini_sys:r_float_ex(sec,"upgr_icon_height")
if not (x and y and w and h) then
self.npc_up_item:Show(false)
return
end
-- Get upgrade dds
local path = icon_override:section_exist(sec) and icon_override:r_string_ex(sec,"upgr_icon_path") or SYS_GetParam(0,sec,"upgr_icon_path") or (IsWeapon(obj) and "ui\\ui_actor_weapons") or "ui\\ui_actor_armor"
self.npc_up_item:InitTexture(path)
self.npc_up_item:SetTextureRect(Frect():set(x, y, x + w, y + h))
self.npc_up_item:SetWndSize(vector2():set( w * ratio , h ))
self.npc_up_item:SetStretchTexture(true)
self.npc_up_item:Show(true)
end