--[[ 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