Divergent/mods/Show All Faction Relations .../gamedata/scripts/ui_pda_relations_tab.script

946 lines
32 KiB
Plaintext

-- ======================================================================
--[[ Show All Faction Relations in PDA
-- ======================================================================
Adapted version of ui_pda_relations_tab.script
Editor: dEmergence (dEmergence @ ModDB)
Source: https://www.moddb.com/mods/stalker-anomaly/addons/show-all-faction-relation-in-pda-except-monolith
Version: 6.2
Updated: 20231220
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
-- ===================================================================--]]
local SINGLETON = nil
function get_ui()
-- SINGLETON = SINGLETON or pda_relations_tab()
SINGLETON = pda_relations_tab()
SINGLETON:Reset()
return SINGLETON
end
-- SAFR faction code reference lists unlocalized to allow for patching:
enc_ref_list = {
"loner",
"duty",
"freedom",
"clear_sky",
"ecologist",
"mercenary",
"military",
"isg",
"renegade",
"bandit",
"greh",
"monolith",
"zombified"
}
faction_code_list = {
"stalker",
"dolg",
"freedom",
"csky",
"ecolog",
"killer",
"army",
"isg",
"renegade",
"bandit",
"greh",
"monolith",
"zombied"
}
-- Reference List for comparison to vanilla settings
local vanilla_faction_code_list = {
"stalker",
"dolg",
"freedom",
"csky",
"ecolog",
"killer",
"army",
"bandit",
"monolith"
}
function d_printf( debugtxt )
if user_debug_log then
printf(tostring( debugtxt ))
end
end
function list_contains(t,value)
for i = 1,#t do
if t[i] == value then
return true
end
end
return false
end
function SetFalse(t)
local s = {}
for _,v in pairs(t) do s[v] = false end
return s
end
function setup_faction_discovery_state_var()
printf("SAFR initializing discovered_factions checklist")
local m_data = alife_storage_manager.get_state()
m_data.SAFR_discovered_factions = SetFalse(game_relations.factions_table)
end
function get_faction_discovery_state(faction)
local m_data = alife_storage_manager.get_state()
if not (m_data.SAFR_discovered_factions) then
setup_faction_discovery_state_var()
end
return m_data.SAFR_discovered_factions[faction]
end
function set_faction_discovery_state(faction)
local m_data = alife_storage_manager.get_state()
if not (m_data.SAFR_discovered_factions) then
setup_faction_discovery_state_var()
end
m_data.SAFR_discovered_factions[faction] = true
end
-- monkeypatching function ui_pda_encyclopedia_tab.detect_intereaction(typ, obj, name)
local originalDIFunction = ui_pda_encyclopedia_tab.detect_intereaction
function ui_pda_encyclopedia_tab.detect_intereaction(typ, obj, name)
--"factions", nil, character_community(obj)
if typ == "factions" and not get_faction_discovery_state(name) then
set_faction_discovery_state(name)
printf("SAFR updated discovered_factions: "..name)
end
originalDIFunction(typ, obj, name)
end
class "pda_relations_tab" (CUIScriptWnd)
-- dmg: moved to access via other functions
local iobj = {}
local kobj = {}
-- dmg: fetch this from MCM settings later
local user_obscure_enemy_squad_count = true
local user_disable_squad_count = true
function pda_relations_tab:__init() super()
-- dmg: Moved self.list code to "pda_relations_tab:Refresh_relations_list()". It is not used until InitControls anyway.
self.clr_red = utils_xml.get_color("red",true) -- GetARGB(255, 255, 1, 1)
self.clr_green = utils_xml.get_color("green",true) -- GetARGB(255, 1, 255, 1)
self.clr_yellow = utils_xml.get_color("yellow",true) -- GetARGB(255, 255, 255, 1)
self.clr_white = utils_xml.get_color("white",true)
self.clr_pda_blue = utils_xml.get_color("pda_blue",true)
self.clr_cyan = utils_xml.get_color("d_cyan",true)
self.clr_orange = utils_xml.get_color("orange",true)
self.clr_pda_green = utils_xml.get_color("pda_green",true)
self.clr_gray = utils_xml.get_color("ui_gray_2",true)
self.clr_d_red = utils_xml.get_color("d_red",true)
-- dmg: Tronex faction column swap code moved and repurposed
self.color_codes = {
GetARGB(255,255,255,255),
GetARGB(255,255,128,0),
GetARGB(255,0,255,255),
GetARGB(255,0,255,128),
GetARGB(255,0,128,255),
GetARGB(255,255,0,128),
GetARGB(255,128,255,0),
GetARGB(255,255,0,0),
GetARGB(255,0,255,0),
GetARGB(255,0,0,255),
GetARGB(255,128,0,255),
}
self.companion_info = {}
self.to_text = true
self._tmr = time_global()
self:InitControls()
end
function pda_relations_tab:__finalize()
end
-- dEmergence: function to refresh self.list
function pda_relations_tab:RefreshKnownFactionsList()
self.list = {}
self.list_squad_count = {}
self.list_squad_count_local = {}
self.list_is_enemy = {}
-- Checking if faction entries in encyclopedia are unlocked to determine relations shown
-- Should never remain empty because own faction should be automatically be unlocked.
-- faction unlocked when encyclopedia article unlocked
local faction_is_unlocked = false
-- vars holding settings from MCM
local user_preset = 2
local user_show_eliminated_factions = true
local user_debug_log = false
local user_use_encyclopedia_discovery = false
if ui_mcm then
printf("ShowAllRelationsPDA: Loading Settings from MCM")
user_debug_log = ui_mcm.get("dmg_safr_pda/debug_log")
d_printf(" Debug Log Enabled: "..tostring(user_debug_log))
user_preset = tonumber(ui_mcm.get("dmg_safr_pda/user_preset"))
d_printf(" MCM User Preset: "..tostring(user_preset))
user_show_eliminated_factions = ui_mcm.get("dmg_safr_pda/show_eliminated")
user_obscure_enemy_squad_count = ui_mcm.get("dmg_safr_pda/obscure_enemy_squad_count")
user_disable_squad_count = ui_mcm.get("dmg_safr_pda/disable_squad_count")
show_mutant_faction = ui_mcm.get("dmg_safr_pda/show_mutant_faction")
user_show_local_squad_count = ui_mcm.get("dmg_safr_pda/show_local_squad_count")
user_use_encyclopedia_discovery = ui_mcm.get("dmg_safr_pda/use_encyclopedia_discovery")
end
printf("")
if show_mutant_faction then
-- modify reference lists accordingly
if not list_contains(faction_code_list,"monster") then
-- assume the others do not contain it either
table.insert(faction_code_list,"monster")
end
end
-- Get number of Squads per faction
local faction_squad_count = {}
local faction_squad_count_local = {}
local on_act_lvl = simulation_objects.is_on_the_actor_level
--if not user_disable_squad_count then
for id,v in pairs( SIMBOARD.squads ) do
local squad = alife_object(id)
for i=1, #faction_code_list do
if (faction_squad_count[i] == nil) then
faction_squad_count[i] = 0
faction_squad_count_local[i] = 0
end
if (squad.player_id == faction_code_list[i]) then
faction_squad_count[i] = faction_squad_count[i] + 1
-- is squad on the same level as actor?
if on_act_lvl(squad) then
faction_squad_count_local[i] = faction_squad_count_local[i] + 1
end
end
end
end
-- debug output
if not user_obscure_enemy_squad_count then
d_printf(" Total Squad Count by Faction:")
for i=1, #faction_code_list do
d_printf(" "..faction_code_list[i].." : "..faction_squad_count[i])
end
d_printf("")
d_printf(" Total Squad Count by Faction on current level:")
for i=1, #faction_code_list do
d_printf(" "..faction_code_list[i].." : "..faction_squad_count_local[i])
end
end
--end
d_printf("")
d_printf(" Checking which factions should be shown by unlocked encyclopedia article:")
local actor_comm = get_actor_true_community()
local actor_is_vanilla_faction = list_contains(vanilla_faction_code_list, actor_comm)
local r_val = 0
local is_enemy = false
for i=1, #enc_ref_list do
d_printf(" Faction: "..game.translate_string(faction_code_list[i]))
if user_use_encyclopedia_discovery then
-- Get info if article is unlocked in encyclopedia instead of discovery state var (required for existing saves w/o all articles unlocked)
faction_is_unlocked = ui_pda_encyclopedia_tab.is_unlocked_article("encyclopedia_factions_"..enc_ref_list[i])
else
faction_is_unlocked = ui_pda_relations_tab.get_faction_discovery_state(faction_code_list[i])
end
if faction_is_unlocked then
d_printf(" encyclopedia_factions_"..enc_ref_list[i].." is unlocked")
end
-- Apply MCM Override values if applicable
if ui_mcm then
if (tonumber(ui_mcm.get("dmg_safr_pda/"..faction_code_list[i])) == 2) then
faction_is_unlocked = true
elseif (tonumber(ui_mcm.get("dmg_safr_pda/"..faction_code_list[i])) == 0) then
faction_is_unlocked = false
end
if (user_preset == 0) then
-- actor faction is automatically unlocked
if (not actor_is_vanilla_faction) and (faction_code_list[i] == actor_comm) then
faction_is_unlocked = true
if user_debug_log then
d_printf(" Preset 0: Set to true - Player is Renegade")
end
end
elseif (user_preset == 1) then
faction_is_unlocked = true
end
if (faction_squad_count[i] == 0) and (user_show_eliminated_factions == false) then
faction_is_unlocked = false
end
else
faction_is_unlocked = true
d_printf(" No MCM: Default to true")
end
if faction_is_unlocked then
self.list[#self.list+1] = faction_code_list[i]
self.list_squad_count[#self.list_squad_count+1] = faction_squad_count[i]
self.list_squad_count_local[#self.list_squad_count_local+1] = faction_squad_count_local[i]
-- Check if enemy to player
r_val = relation_registry.community_relation(actor_comm, faction_code_list[i])
d_printf(" Relation to Player: "..r_val)
is_enemy = (r_val <= game_relations.ENEMIES)
self.list_is_enemy[#self.list_is_enemy+1] = is_enemy
d_printf(" Is Enemy: "..tostring(is_enemy))
end
end
if show_mutant_faction then
self.list[#self.list+1] = "monster"
end
end
function pda_relations_tab:on_option_change()
self:Reset()
end
function pda_relations_tab:on_game_start()
RegisterScriptCallback("on_option_change",self:on_option_change())
end
function pda_relations_tab:RefreshRelationsMatrix()
-- dEmergence: Refresh Known Faction List first
-- self:RefreshKnownFactionsList()
local max_i_index = #self.list
local max_k_index = #self.list + 1
if user_disable_squad_count then
max_k_index = max_i_index
end
local k_index = 0
local actor_comm = get_actor_true_community()
for i=1, max_i_index do
-- dmg : catch possibility of all factions being set to "never_show"
if max_i_index > 0 and i <= max_i_index then
if not user_disable_squad_count then
if (self.list_squad_count[i] == 0) or (self.list_is_enemy[i] and user_obscure_enemy_squad_count) then
iobj[i]:SetTextColor(self.clr_gray)
end
end
if (self.list[i] == actor_comm) then
iobj[i]:SetTextColor(self.clr_pda_blue)
end
iobj[i]:SetText(game.translate_string(self.list[i]))
else
iobj[i]:SetText("")
end
for k=0, max_k_index do
if (i == 1) then
if (k == 0) and not user_disable_squad_count then
--if user_disable_squad_count then
-- kobj[k]:SetTextColor(self.clr_gray)
--else
kobj[k]:SetTextColor(self.clr_cyan)
--end
kobj[k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadcount"))
elseif (k == 1 and not user_disable_squad_count) or (k == 0 and user_disable_squad_count) then
kobj[k]:SetTextColor(self.clr_pda_green)
kobj[k]:SetText(game.translate_string("st_ui_goodwill_name"))
else
-- dmg : catch possibility of all factions being set to "never_show"
if max_i_index > 0 and k <= max_k_index then
if not user_disable_squad_count then
k_index = k - 1
else
k_index = k
end
if not user_disable_squad_count then
if (self.list_squad_count[k_index] == 0) or (self.list_is_enemy[k_index] and user_obscure_enemy_squad_count) then
kobj[k]:SetTextColor(self.clr_gray)
end
end
if (self.list[k_index] == actor_comm) then
kobj[k]:SetTextColor(self.clr_pda_blue)
end
kobj[k]:SetText(game.translate_string(self.list[k_index]))
else
kobj[k]:SetText("")
end
end
end
end
end
end
function pda_relations_tab:InitControls()
-- SAFR: Call early to get # of factions to show
self:RefreshKnownFactionsList()
self:SetWndRect(Frect():set(0, 0, 1024, 768))
local xml = CScriptXmlInit()
if #self.list < 10 then
if not user_disable_squad_count then
xml:ParseFile("pda_relations_f9.xml")
else
xml:ParseFile("pda_relations_f9x.xml")
end
elseif #self.list == 10 then
if not user_disable_squad_count then
xml:ParseFile("pda_relations_f10.xml")
else
xml:ParseFile("pda_relations_f10x.xml")
end
elseif #self.list == 11 then
if not user_disable_squad_count then
xml:ParseFile("pda_relations_f11.xml")
else
xml:ParseFile("pda_relations_f11x.xml")
end
elseif #self.list == 12 then
if not user_disable_squad_count then
xml:ParseFile("pda_relations_f12.xml")
else
xml:ParseFile("pda_relations_f12x.xml")
end
elseif #self.list == 13 then
if not user_disable_squad_count then
xml:ParseFile("pda_relations_f13.xml")
else
xml:ParseFile("pda_relations_f13x.xml")
end
else
if not user_disable_squad_count then
xml:ParseFile("pda_relations_f14.xml")
else
xml:ParseFile("pda_relations_f14x.xml")
end
end
xml:InitFrame("frame",self)
xml:InitStatic("center_background", self)
self.tab = xml:InitStatic("tab", self)
xml:InitStatic("tab:caption", self.tab)
self.btn = xml:Init3tButton("btn_to_text", self)
self:Register(self.btn, "btn")
self:AddCallback("btn", ui_events.BUTTON_CLICKED, self.btn_to_text, self)
-- dEmergence: Relation Matrix XML Setup only. Modified code to create objects for all col and row objects (13x14) that fit the template.
self.relations = {}
local is_widescreen = true --utils_xml.is_widescreen()
local x = is_widescreen and 40 or 55
local c_width = is_widescreen and 75 or 90
local c_height = 31.81
local c_count_h = #self.list
local c_count_v = #self.list + 2
if user_disable_squad_count then
c_height = 35
c_count_v = #self.list + 1
end
if #self.list > 9 then
c_width = is_widescreen and ( 675 / c_count_h ) or ( 90 / (75 / ( 675 / c_count_h )))
c_height = (350 / ( c_count_v ))
end
local x_offset = 0
for i=1, c_count_h do
x = x + c_width
if (i == 1) then
-- x_offset = x + 10
if c_count_h > 9 then
x_offset = x + ((c_count_h - 9) * 2.75)
else
x_offset = x
end
else
x_offset = x
end
iobj[i] = xml:InitTextWnd("tab:faction", self.tab)
iobj[i]:SetWndPos(vector2():set(x_offset,65))
iobj[i]:SetText("")
self.relations[i] = {}
-- local y = 65
local y = 60
if c_count_h > 9 then
y = y + ((c_count_h - 9) * 1.7)
end
for k=0, (c_count_v - 1) do
y = y + c_height
if (i == 1) then
kobj[k] = xml:InitTextWnd("tab:faction", self.tab)
kobj[k]:SetWndPos(vector2():set(x - c_width, y))
kobj[k]:SetText("")
end
self.relations[i][k] = xml:InitTextWnd("tab:cell",self.tab)
self.relations[i][k]:SetWndPos(vector2():set(x_offset,y))
self.relations[i][k]:SetText("")
end
if (i == 1) then
x = x_offset
end
end
-- Companion ListView
xml:InitFrame("companion_frame",self)
xml:InitStatic("companion_background",self)
self.companion_listbox = xml:InitListBox("companion_wnd",self)
self.companion_listbox:SetItemHeight(140)
self.auto_chk = xml:InitCheck("auto_check",self)
self.auto_chk:SetCheck(false)
for row=1,4 do
local row_form = ui_companion_row(self,row,xml)
row_form:SetWndSize(vector2():set(740,140))
self.companion_listbox:AddExistingItem(row_form)
end
-- Hint Window
self.hint_wnd = utils_ui.UIHint(self)
-- self:Reset()
end
function pda_relations_tab:Update()
CUIScriptWnd.Update(self)
-- option to auto update values
if self.auto_chk:GetCheck() then
local tg = time_global()
if self._tmr < tg then
self._tmr = tg + 2000
self:autoupdate()
end
end
if not (self.disabled) then
for i=1, 24 do -- should be row*col from ui_companion_row
if (self.companion_info[i].icon_wnd:IsShown()) then
local pos = GetCursorPosition()
local rect = Frect():set(0,0,0,0)
self.companion_info[i].icon_wnd:GetAbsoluteRect(rect)
if (utils_data.pos_in_rect(pos,rect)) then
self.hint_wnd:Update(self.companion_info[i].hint)
self.mouse_over_id = i
return
end
end
end
end
self.mouse_over_id = nil
self.hint_wnd:Update()
end
function pda_relations_tab:autoupdate()
local id_to_code = {}
local clist = axr_companions.list_actor_squad_by_id()
local sim = alife()
for i=1,24 do -- should be row*col from ui_companion_row
local se_obj = clist[i] and alife_object(clist[i])
if (se_obj and IsStalker(nil,se_obj:clsid()) and se_obj:alive()) then
local full_name = se_obj:character_name()
local name = string.gsub(full_name,"Junior","Jr.")
name = string.gsub(name,"Senior","Sr.")
name = string.gsub(name,"Master ","M")
name = string.gsub(name,"Private","PVT")
name = string.gsub(name,"Sergeant","SGT")
name = string.gsub(name,"Lieutenant","LT")
name = string.gsub(name,"Captain","CPT")
local name = string.len(name) <= 22 and name or string.sub(name, 0, 19) .. "..."
self.companion_info[i].id = se_obj.id
local st = db.storage[se_obj.id]
local npc = st and st.object
local icon_name = npc and npc:character_icon() or se_obj:character_icon()
icon_name = icon_name and icon_name ~= "" and icon_name or "ui\\ui_noise"
self.companion_info[i].icon_wnd:InitTexture(icon_name)
self.companion_info[i].icon_wnd:Show(true)
self.companion_info[i].name_wnd:SetText(name)
self.companion_info[i].comm_wnd:SetText(game.translate_string(se_obj:community()))
self.companion_info[i].rank_wnd:SetText(game.translate_string("st_rank_"..ranks.get_se_obj_rank_name(se_obj)).." ("..se_obj:rank()..")")
self.companion_info[i].dist_wnd:SetText(string.format(game.translate_string("st_distance_to")..": %.2f", se_obj.position:distance_to(db.actor:position())))
-- leader and relation status
local squad = se_obj.group_id and se_obj.group_id ~= 65535 and alife_object(se_obj.group_id)
if (squad and squad:commander_id() == se_obj.id) then
self.companion_info[i].leader_wnd:Show(true)
self.companion_info[i].leader_wnd:InitTexture("ui_minimap_squad_leader")
else
self.companion_info[i].leader_wnd:Show(true)
self.companion_info[i].leader_wnd:InitTexture("ui_minimap_point")
end
-- Set color code
if not (id_to_code[se_obj.group_id]) then
local n = 1
for k,v in pairs(id_to_code) do
n = n + 1
end
id_to_code[se_obj.group_id] = self.color_codes[n] or self.color_codes[1]
end
self.companion_info[i].leader_wnd:SetTextureColor(id_to_code[se_obj.group_id])
-- health status
if (npc) then
local hp = math.floor(npc.health*100)
self.companion_info[i].health_wnd:SetText(hp.."%")
if (hp > 70) then
self.companion_info[i].health_wnd:SetTextColor(GetARGB(200, 0, 255, 0))
elseif (hp < 30) then
self.companion_info[i].health_wnd:SetTextColor(GetARGB(200, 255, 0, 0))
else
self.companion_info[i].health_wnd:SetTextColor(GetARGB(200, 255, 255, 255))
end
end
-- Hint
local s_move,s_combat,s_gather,s_loot,s_dist,s_stealth,s_arte,s_stalker,s_mutant,s_wounded,s_corpse,s_dismiss,s_tele
local state_str = [[
%c[255,255,215,255]%c[default]%s \n
\n%c[255,215,215,215]st_mm_pda_location:%c[default] %s \n
\n%c[255,215,215,215]st_mm_pda_states:%c[default] \n
%c[255,160,160,160]st_mm_pda_movement:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_combat:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_pickup_items:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_loot_corpses:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_keep_distance:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_stealth:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_dismissable:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_level_travel:%c[default] %s \n
\n%c[255,215,215,215]st_mm_pda_statistics:%c[default] \n
%c[255,160,160,160]st_mm_pda_stalkers_killed:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_mutants_killed:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_artes_found:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_wounded_helped:%c[default] %s \n
%c[255,160,160,160]st_mm_pda_corpse_looted:%c[default] %s \n
]]
if (sim:has_info(se_obj.id,"npcx_beh_wait")) then
s_move = game.translate_string("st_set_companion_to_wait_state")
elseif (sim:has_info(se_obj.id,"npcx_beh_patrol_mode")) then
s_move = game.translate_string("st_set_companion_to_patrol_state")
else
s_move = game.translate_string("st_set_companion_to_follow_state")
end
if (sim:has_info(se_obj.id,"npcx_beh_ignore_actor_enemies") and sim:has_info(se_obj.id,"npcx_beh_ignore_combat")) then
s_combat = game.translate_string("st_set_companion_to_ignore_combat_state")
elseif (sim:has_info(se_obj.id,"npcx_beh_ignore_combat")) then
s_combat = game.translate_string("st_set_companion_to_attack_only_actor_combat_enemy_state")
else
s_combat = game.translate_string("st_set_companion_to_attack_state")
end
local can_gather = sim:has_info(se_obj.id,"npcx_beh_gather_items")
local can_loot = sim:has_info(se_obj.id,"npcx_beh_loot_corpses")
s_gather = can_gather and game.translate_string("st_pda_mode_on") or game.translate_string("st_pda_mode_off")
s_loot = can_loot and game.translate_string("st_pda_mode_on") or game.translate_string("st_pda_mode_off")
if (npc) then
-- If looting is set false in logic
if (can_gather and st.gather_items and st.gather_items.gather_items_enabled and xr_logic.pick_section_from_condlist(db.actor, npc, st.gather_items.gather_items_enabled) == "false") then
s_gather = game.translate_string("st_pda_mode_disabled")
end
if (can_loot and st.corpse_detection and st.corpse_detection.corpse_detection_enabled and xr_logic.pick_section_from_condlist(db.actor, npc, st.corpse_detection.corpse_detection_enabled) == "false") then
s_loot = game.translate_string("st_pda_mode_disabled")
end
end
s_dist = sim:has_info(se_obj.id,"npcx_beh_distance_far") and game.translate_string("st_pda_mode_dist_far") or game.translate_string("st_pda_mode_dist_near")
s_stealth = sim:has_info(se_obj.id,"npcx_beh_substate_stealth") and game.translate_string("st_pda_mode_on") or game.translate_string("st_pda_mode_off")
local m_data = alife_storage_manager.get_se_obj_state(se_obj)
if (m_data) then
s_stalker = m_data["killed_stalkers"] or 0
s_mutant = m_data["killed_monsters"] or 0
s_arte = m_data["artefacts_found"] or 0
s_wounded = m_data["wounded_helped"] or 0
s_corpse = m_data["corpse_looted"] or 0
end
s_dismiss = se_load_var(se_obj.id,se_obj:name(),"companion_cannot_dismiss") and game.translate_string("st_pda_mode_false") or game.translate_string("st_pda_mode_true")
s_tele = se_load_var(se_obj.id,se_obj:name(),"companion_cannot_teleport") and game.translate_string("st_pda_mode_disabled") or game.translate_string("st_pda_mode_enabled")
local s_location = game.translate_string(sim:level_name(game_graph():vertex(se_obj.m_game_vertex_id):level_id()))
for s in string.gmatch(state_str,"(st_mm_pda_[%w%d_]*)") do
state_str = string.gsub(state_str,s,game.translate_string(s))
end
state_str = strformat(state_str,full_name,s_location,s_move,s_combat,s_gather,s_loot,s_dist,s_stealth,s_dismiss,s_tele,s_stalker,s_mutant,s_arte,s_wounded,s_corpse)
self.companion_info[i].hint = state_str
else
self.companion_info[i].id = nil
self.companion_info[i].icon_wnd:Show(false)
self.companion_info[i].leader_wnd:Show(false)
self.companion_info[i].health_wnd:SetText("")
self.companion_info[i].name_wnd:SetText("")
self.companion_info[i].comm_wnd:SetText("")
self.companion_info[i].rank_wnd:SetText("")
self.companion_info[i].dist_wnd:SetText("")
end
end
end
function pda_relations_tab:Reset()
-- dEmergence: Refresh Relations Matrix
self:RefreshRelationsMatrix()
local max_i_index = #self.list
local max_k_index = #self.list + 1
if user_disable_squad_count then
max_k_index = max_i_index
end
local k_index = 0
for i=1, max_i_index do
for k=0, max_k_index do
-- dmg : catch possibility of all factions being set to "never_show"
if max_i_index > 0 and i <= max_i_index and k <= max_k_index then
if not user_disable_squad_count then
k_index = k - 1
else
k_index = k
end
local r_val = 0
local r_val2 = 0
if (k > 0 and not user_disable_squad_count) or (user_disable_squad_count) then
local comm = self.list[k_index] or db.actor:character_community()
r_val = relation_registry.community_relation(comm, self.list[i])
end
if (k == 0) and not user_disable_squad_count then
-- if first row then squad count
r_val = self.list_squad_count[i] or 0
r_val2 = self.list_squad_count_local[i] or 0
if self.list_is_enemy[i] then
if user_obscure_enemy_squad_count then
self.relations[i][k]:SetTextColor(self.clr_gray)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_na"))
else
if r_val >= 25 then
self.relations[i][k]:SetTextColor(self.clr_red)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_5"))
elseif r_val < 25 and r_val >= 15 then
self.relations[i][k]:SetTextColor(self.clr_d_red)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_4"))
elseif r_val < 15 and r_val >= 10 then
self.relations[i][k]:SetTextColor(self.clr_orange)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_3"))
elseif r_val < 10 and r_val >= 6 then
self.relations[i][k]:SetTextColor(self.clr_yellow)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_2"))
elseif r_val < 6 and r_val > 0 then
self.relations[i][k]:SetTextColor(self.clr_yellow)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_1"))
else
self.relations[i][k]:SetTextColor(self.clr_gray)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_0"))
end
end
else
if r_val >= 25 then
self.relations[i][k]:SetTextColor(self.clr_green)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_5"))
elseif r_val < 25 and r_val >= 15 then
self.relations[i][k]:SetTextColor(self.clr_pda_green)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_4"))
elseif r_val < 15 and r_val >= 10 then
self.relations[i][k]:SetTextColor(self.clr_yellow)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_3"))
elseif r_val < 10 and r_val >= 6 then
self.relations[i][k]:SetTextColor(self.clr_orange)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_2"))
elseif r_val < 6 and r_val > 0 then
self.relations[i][k]:SetTextColor(self.clr_red)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_1"))
else
self.relations[i][k]:SetTextColor(self.clr_gray)
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_0"))
end
end
elseif (k == 1 and not user_disable_squad_count) or (k == 0 and user_disable_squad_count) then
-- if second row (or first and squad count disabled) then goodwill
r_val = relation_registry.community_goodwill(self.list[i],AC_ID)
if r_val >= 2000 then
self.relations[i][k]:SetTextColor(self.clr_green)
self.relations[i][k]:SetText(game.translate_string("st_ui_goodwill_5"))
elseif r_val < 2000 and r_val >= 1500 then
self.relations[i][k]:SetTextColor(self.clr_yellow)
self.relations[i][k]:SetText(game.translate_string("st_ui_goodwill_4"))
elseif r_val < 1500 and r_val >= 1000 then
self.relations[i][k]:SetTextColor(self.clr_yellow)
self.relations[i][k]:SetText(game.translate_string("st_ui_goodwill_3"))
elseif r_val < 1000 and r_val >= 500 then
self.relations[i][k]:SetTextColor(self.clr_yellow)
self.relations[i][k]:SetText(game.translate_string("st_ui_goodwill_2"))
else
self.relations[i][k]:SetTextColor(self.clr_red)
self.relations[i][k]:SetText(game.translate_string("st_ui_goodwill_1"))
end
else
if r_val >= game_relations.FRIENDS then
self.relations[i][k]:SetTextColor(self.clr_green)
self.relations[i][k]:SetText(game.translate_string("st_goodwill_friendly"))
elseif r_val <= game_relations.ENEMIES then
self.relations[i][k]:SetTextColor(self.clr_red)
self.relations[i][k]:SetText(game.translate_string("st_goodwill_enemy"))
else
self.relations[i][k]:SetTextColor(self.clr_yellow)
self.relations[i][k]:SetText(game.translate_string("st_goodwill_indifferent"))
end
end
if not (self.to_text) then
if k > 0 then
self.relations[i][k]:SetText(tostring(r_val))
else
if not user_disable_squad_count then
--self.relations[i][k]:SetText("-")
if (self.list_is_enemy[i] and user_obscure_enemy_squad_count) then
self.relations[i][k]:SetText(game.translate_string("st_ui_dmg_safr_pda_squadsize_na"))
elseif user_show_local_squad_count then
self.relations[i][k]:SetText(tostring(r_val).." ("..tostring(r_val2)..")")
else
self.relations[i][k]:SetText(tostring(r_val))
end
else
self.relations[i][k]:SetText(tostring(r_val))
end
end
end
else
self.relations[i][k]:SetText("")
end
end
end
self:autoupdate()
end
function pda_relations_tab:btn_to_text()
self.to_text = not self.to_text
if self.to_text then
self.btn:TextControl():SetText(game.translate_string("pda_table_value_off"))
else
self.btn:TextControl():SetText(game.translate_string("pda_table_value_on"))
end
self:Reset()
end
---------------------------------------------------------------------------------------------------
--
---------------------------------------------------------------------------------------------------
class "ui_companion_row" (CUIListBoxItem)
function ui_companion_row:__init(owner,row,xml) super(owner,row,xml)
self:GetTextItem():SetText("")
local is_widescreen = true --utils_xml.is_widescreen()
local x = is_widescreen and 20 or 35
local y = 0
for i=1,6 do
local n = i+(6*(row-1))
owner.companion_info[n] = {
["id"] = nil,
["icon_wnd"] = self:AddIconField(1),
["leader_wnd"] = self:AddIconField(1),
["name_wnd"] = self:AddTextField("",1),
["comm_wnd"] = self:AddTextField("",1),
["rank_wnd"] = self:AddTextField("",1),
["health_wnd"] = self:AddTextField("",1),
["dist_wnd"] = self:AddTextField("",1),
["hint"] = ""
}
owner.companion_info[n].icon_wnd:InitTexture("ui\\ui_noise")
owner.companion_info[n].icon_wnd:SetStretchTexture(true)
owner.companion_info[n].icon_wnd:SetWndSize(vector2():set(64,64))
owner.companion_info[n].icon_wnd:SetWndPos(vector2():set(x,y))
owner.companion_info[n].leader_wnd:InitTexture("ui_minimap_squad_leader")
owner.companion_info[n].leader_wnd:SetStretchTexture(true)
owner.companion_info[n].leader_wnd:SetWndSize(vector2():set(is_widescreen and 8 or 10,10))
owner.companion_info[n].leader_wnd:SetWndPos(vector2():set(x,y))
owner.companion_info[n].name_wnd:SetFont(GetFontLetterica18Russian())
owner.companion_info[n].name_wnd:SetWndSize(vector2():set(120,22))
owner.companion_info[n].name_wnd:SetWndPos(vector2():set(x,y+65))
owner.companion_info[n].comm_wnd:SetFont(GetFontLetterica16Russian())
owner.companion_info[n].comm_wnd:SetWndSize(vector2():set(120,20))
owner.companion_info[n].comm_wnd:SetWndPos(vector2():set(x,y+90))
owner.companion_info[n].rank_wnd:SetFont(GetFontLetterica16Russian())
owner.companion_info[n].rank_wnd:SetWndSize(vector2():set(120,20))
owner.companion_info[n].rank_wnd:SetWndPos(vector2():set(x,y+105))
owner.companion_info[n].health_wnd:SetFont(GetFontSmall())
owner.companion_info[n].health_wnd:SetWndSize(vector2():set(50,10))
owner.companion_info[n].health_wnd:SetWndPos(vector2():set(x+50,y+55))
owner.companion_info[n].dist_wnd:SetFont(GetFontLetterica16Russian())
owner.companion_info[n].dist_wnd:SetWndSize(vector2():set(120,20))
owner.companion_info[n].dist_wnd:SetWndPos(vector2():set(x,y+120))
x = x + (is_widescreen and 125 or 155)
end
end