Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[-----------------------------------------------------------------------------------------------
- File : sa_upgrade.script
- Description : Апгрейд оружия
- Copyright : Shadows Addon
- Author : Ray Twitty aka Shadows
- Date : 30.01.2012
- Last edit : 14.01.2019
- --]]-----------------------------------------------------------------------------------------------
- local upgrade_dialog, talk_dialog
- --[[-----------------------------------------------------------------------------------------------
- * UPGRADE DIALOG
- --]]-----------------------------------------------------------------------------------------------
- class "CUIUpgradeListItem" (CUIListItemEx)
- function CUIUpgradeListItem:__init(obj, xml) super()
- self.st_item_name = xml:InitStatic("list_item_static", self)
- self.st_item_name:SetText(get_inventory_item_data(obj, "inv_name"))
- --[[if db.actor:is_in_slot(obj) then
- self.st_item_name:SetTextColor(255, 100, 230, 100)
- end]]
- if exist_line(obj:section(), "installed_upgrades") then
- self.st_item_name:InitTexture("ui_beltweaponUpd")
- end
- end
- ---------------------------------------------------------------------------------------------------
- class "CUIUpgradeDialog" (CUIScriptWnd)
- function CUIUpgradeDialog:__init(mechanic, mechanic_data, ini) super()
- self:Init(0, 0, 1024, 768)
- self.last_id = 0
- self.list_ids = {}
- self.btn_upgrade_cells = {}
- self.st_green_indicators = {}
- self.mechanic = mechanic
- self.mechanic_data = mechanic_data
- self.ini = ini
- self.xml = CScriptXmlInit()
- self.xml:ParseFile("upgrade.xml")
- -- background static
- self.st_background = self.xml:InitStatic("main", self)
- -- top background static
- self.xml:InitStatic("top_background", self)
- -- bottom background static
- self.xml:InitStatic("bottom_background", self)
- -- weight static
- self.st_weight = self.xml:InitStatic("weight_static", self.st_background)
- self.st_weight:SetText(self:weight_static())
- -- items list
- self.list_items = self.xml:InitList("items_list", self.st_background)
- self.list_items:ShowSelectedItem(true)
- self:Register(self.list_items, "items_list")
- db.actor:iterate_inventory(
- function(dummy, obj)
- if obj:is_weapon_magazined()
- or obj:is_binoculars()
- or read_line(obj:section(), "upgrade_allowed", "bool")
- or obj:is_outfit() then
- self.list_items:AddItem(CUIUpgradeListItem(obj, self.xml))
- table.insert(self.list_ids, obj:id())
- end
- end
- )
- self:AddCallback("items_list", ui_events.LIST_ITEM_CLICKED, self.on_list_items, self)
- -- repair button
- self.btn_repair = self.xml:Init3tButton("repair_button", self.st_background)
- self.btn_repair:Enable(false)
- self:Register(self.btn_repair, "repair_button")
- self:AddCallback("repair_button", ui_events.BUTTON_CLICKED, self.on_button_repair, self)
- -- upgrade button
- self.btn_upgrade = self.xml:Init3tButton("upgrade_button", self.st_background)
- self.btn_upgrade:Enable(false)
- self:Register(self.btn_upgrade, "upgrade_button")
- self:AddCallback("upgrade_button", ui_events.BUTTON_CLICKED, self.on_button_upgrade, self)
- -- exit button
- self:Register(self.xml:Init3tButton("exit_button", self), "exit_button")
- self:AddCallback("exit_button", ui_events.BUTTON_CLICKED, self.on_button_exit, self)
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:on_list_items()
- if validate_list(self.list_items) then
- self.current_index = self.list_items:GetSelectedItem()
- self.current_item = self.list_items:GetItem(self.current_index)
- local current_id = self.list_ids[self.current_index + 1]
- if self.last_id ~= current_id then
- self:update_object_data(level.object_by_id(current_id))
- self:update_item_info()
- self:hide_upgrade_info()
- self:clear_green_indicators()
- self:update_upgrade_cells(true)
- self.last_id = current_id
- end
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:on_button_repair()
- if self.condition >= self.mechanic_data.min_condition then
- if db.actor:money() >= self:generate_repair_cost() then
- start_message_box("ui_st_repair_item", "alarm", "yes_no", {"sa_upgrade.get_upgrade_dialog():item_repair()"})
- else
- start_message_box("ui_st_not_enough_money", "red")
- end
- else
- start_message_box("ui_st_repair_critical_condition", "red")
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:on_button_upgrade()
- if self.condition >= self.mechanic_data.upgrade_min_condition then
- if db.actor:money() >= self:generate_upgrade_cost() then
- start_message_box("ui_st_upgrade_item", "alarm", "yes_no", {"sa_upgrade.get_upgrade_dialog():item_upgrade()"})
- else
- start_message_box("ui_st_not_enough_money", "red")
- end
- else
- start_message_box("ui_st_upgrade_critical_condition", "red")
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:on_button_exit(skip_talk)
- upgrade_dialog = nil
- level.start_stop_menu(self, true)
- db.actor:restore_weapon()
- if not skip_talk then
- db.actor:run_talk_dialog(self.mechanic)
- end
- db.actor:give_info_portion("ui_upgrade_hide")
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:update_item_info()
- -- item info static
- if not self.st_item_info then
- self.st_item_info = self.xml:InitStatic("item_info", self.st_background)
- end
- -- item image static
- if not self.st_item_image then
- self.st_item_image = self.xml:InitStatic("item_info:image_static", self.st_item_info)
- end
- self.st_item_image:InitTexture(read_line(self.section, "image", "string", system_ini(), "$empty"))
- -- item name static
- if not self.st_item_name then
- self.st_item_name = self.xml:InitStatic("item_info:name_static", self.st_item_info)
- end
- self.st_item_name:SetText(get_inventory_item_data(self.object, "inv_name"))
- -- item description scroll view
- if not self.sv_item_descr then
- self.sv_item_descr = self.xml:InitScrollView("item_info:scroll_view", self.st_item_info)
- end
- self.sv_item_descr:Clear()
- -- item description static
- if self.st_item_descr then
- self.st_item_descr:DetachFromParent()
- end
- self.st_item_descr = self.xml:InitStatic("item_info:descr_static", self.sv_item_descr)
- self.st_item_descr:SetText(get_inventory_item_data(self.object, "description"))
- self.st_item_descr:AdjustHeightToText()
- -- item weight static
- if not self.st_item_weight then
- self.st_item_weight = self.xml:InitStatic("item_info:weight_static", self.st_item_info)
- end
- self.st_item_weight:SetText(string.format("%s: %.2f kg", game.translate_string("st_weight"), self.object:get_weight()))
- -- item cost static
- if not self.st_item_cost then
- self.st_item_cost = self.xml:InitStatic("item_info:cost_static", self.st_item_info)
- end
- self.st_item_cost:SetText(game.translate_string("st_base_cost")..": "..self.object:cost().." RU")
- -- item condition progress bar
- if not self.pb_item_condition then
- self.pb_item_condition = self.xml:InitProgressBar("item_info:condition_progress", self.st_item_info)
- end
- self.pb_item_condition:SetProgressPos(self.condition * 100)
- -- item condition static
- if not self.st_item_condition then
- self.st_item_condition = self.xml:InitStatic("item_info:condition_static", self.st_item_info)
- end
- -- money static
- if not self.st_money then
- self.st_money = self.xml:InitStatic("item_info:money_static", self.st_item_info)
- end
- self.st_money:SetText(game.translate_string("id_mp_money")..": "..db.actor:money().." RU")
- -- repair static
- if not self.st_repair then
- self.st_repair = self.xml:InitStatic("item_info:repair_static", self.st_item_info)
- end
- if self.condition < 0.99 then
- self.st_repair:SetText(game.translate_string("ui_upgr_repair_cost")..": "..self:generate_repair_cost().." RU")
- self.btn_repair:Enable(true)
- else
- self.st_repair:SetTextST("ui_upgr_item_not_need_repair")
- self.btn_repair:Enable(false)
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:update_upgrade_info()
- -- upgrade info static
- if not self.st_upgrade_info then
- self.st_upgrade_info = self.xml:InitStatic("upgrade_info", self.st_background)
- end
- self.st_upgrade_info:Show(true)
- -- upgrade name static
- if not self.st_upgrade_name then
- self.st_upgrade_name = self.xml:InitStatic("upgrade_info:name_static", self.st_upgrade_info)
- end
- self.st_upgrade_name:SetTextST(self.upgrade_data.name)
- -- upgrade description scroll view
- if not self.sv_upgrade_descr then
- self.sv_upgrade_descr = self.xml:InitScrollView("upgrade_info:scroll_view", self.st_upgrade_info)
- end
- self.sv_upgrade_descr:Clear()
- -- upgrade description static
- if self.st_upgrade_descr then
- self.st_upgrade_descr:DetachFromParent()
- end
- self.st_upgrade_descr = self.xml:InitStatic("upgrade_info:descr_static", self.sv_upgrade_descr)
- self.st_upgrade_descr:SetTextST(self.upgrade_data.description)
- self.st_upgrade_descr:AdjustHeightToText()
- -- upgrade cost static
- if not self.st_upgrade_cost then
- self.st_upgrade_cost = self.xml:InitStatic("upgrade_info:cost_static", self.st_upgrade_info)
- end
- self.st_upgrade_cost:SetText(game.translate_string("st_base_cost")..": "..self:generate_upgrade_cost().." RU")
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:hide_upgrade_info()
- if self.st_upgrade_info then
- self.st_upgrade_info:Show(false)
- end
- self.btn_upgrade:Enable(false)
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:add_green_indicator(btn_name)
- local btn = self:GetButton(btn_name)
- self.st_green_indicator = CUIStatic()
- self.st_green_indicator:Init("ui_upgrade_cell_green_upgraded", btn:GetHPos() + 3, btn:GetVPos() + 3, 5, 38)
- self.st_background:AttachChild(self.st_green_indicator)
- table.insert(self.st_green_indicators, self.st_green_indicator)
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:clear_green_indicators()
- for k, v in pairs(self.st_green_indicators) do
- v:DetachFromParent()
- end
- clear_table(self.st_green_indicators)
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:on_button_upgrade_cell(upgrade_data, enable)
- self.upgrade_data = upgrade_data
- self:update_upgrade_info()
- self.btn_upgrade:Enable(enable)
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:item_repair()
- db.actor:transfer_money(self:generate_repair_cost(), self.mechanic)
- self.object:set_condition(1)
- self.condition = 1
- self:update_item_info()
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:item_upgrade()
- db.actor:transfer_money(self:generate_upgrade_cost(), self.mechanic)
- self:replace_item(self.upgrade_data.replace_section)
- self:add_green_indicator(self.upgrade_data.btn_upgrade_cell_name)
- self.btn_upgrade:Enable(false)
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:update_upgrade_cells(first_init)
- if first_init then
- for k, v in pairs(self.btn_upgrade_cells) do
- v:DetachFromParent()
- end
- clear_table(self.btn_upgrade_cells)
- if self.upgrade_allowed then
- for k, v in pairs(self.upgrades_table) do
- self.btn_upgrade_cell = self.xml:Init3tButton(self.upgrade_scheme..":cell_"..k, self.st_background)
- self.btn_upgrade_cell:Enable(false)
- self:Register(self.btn_upgrade_cell, v)
- --self:AddCallback(v, ui_events.BUTTON_DOWN, function() self:on_button_upgrade_cell(self:get_upgrade_data(k, v)) end)
- self.btn_upgrade_cells[k] = self.btn_upgrade_cell
- end
- if self.available_upgrades_table and self.available_upgrades_table[1] ~= "none" then
- self:unlock_upgrades(self.available_upgrades_table)
- end
- if self.installed_upgrades_table then
- for k, v in pairs(self.installed_upgrades_table) do
- self:add_green_indicator(v)
- end
- end
- end
- else
- if self.upgrade_allowed then
- if self.upgrades_table then
- self:lock_upgrades(self.upgrades_table)
- end
- if self.available_upgrades_table and self.available_upgrades_table[1] ~= "none" then
- self:unlock_upgrades(self.available_upgrades_table)
- end
- end
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:update_object_data(obj)
- self.object = obj
- self.section = obj:section()
- self.condition = obj:condition()
- self.upgrade_allowed = read_line(self.section, "upgrade_allowed", "bool")
- if self.upgrade_allowed then
- self.upgrades_table = string.split(read_line(self.section, "upgrades", "string"), ",")
- self.available_upgrades_table = string.split(read_line(self.section, "available_upgrades", "string"), ",")
- self.installed_upgrades_table = string.split(read_line(self.section, "installed_upgrades", "string"), ",")
- self.upgrade_scheme = read_line(self.section, "upgrade_scheme", "string")
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:get_upgrade_data(btn_upgrade_cell_id, btn_upgrade_cell_name)
- local upgrade = self.upgrades_table[btn_upgrade_cell_id]
- if upgrade then
- local upgrade_data = {}
- upgrade_data.name = read_line(upgrade, "name", "string", self.ini)
- upgrade_data.description = read_line(upgrade, "description", "string", self.ini)
- upgrade_data.cost = read_line(upgrade, "cost", "number", self.ini)
- upgrade_data.replace_section = read_line(upgrade, "replace_section", "string", self.ini)
- upgrade_data.btn_upgrade_cell_name = btn_upgrade_cell_name
- return upgrade_data
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:lock_upgrades(lock_upgrades_table)
- for k, v in pairs(lock_upgrades_table) do
- self:GetButton(v):Enable(false)
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:unlock_upgrades(unlock_upgrades_table)
- for k, v in pairs(unlock_upgrades_table) do
- self:GetButton(v):Enable(true)
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:weight_static()
- local outfit = db.actor:get_current_outfit()
- local total_weight = db.actor:get_inventory_weight()
- local max_weight = db.actor:get_actor_max_weight()
- if outfit then
- max_weight = max_weight + get_outfit_data(outfit, "additional_inventory_weight2")
- end
- if total_weight > max_weight then
- return string.format("%s%s %s%.1f %s/ %.1f", "%c[UI_orange]", game.translate_string("ui_inv_weight"), "%c[red]", total_weight, "%c[UI_orange]", max_weight)
- else
- return string.format("%s%s %.1f / %.1f", "%c[UI_orange]", game.translate_string("ui_inv_weight"), total_weight, max_weight)
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:generate_repair_cost()
- return math.floor((1 - self.condition) * self.object:cost() * self.mechanic_data.markup)
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:generate_upgrade_cost()
- return math.floor(self.upgrade_data.cost * self.mechanic_data.upgrade_markup)
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:replace_item(section)
- if self.object:is_weapon() then
- if get_weapon_data(self.object, "is_attached_scope") then
- spawn_item_in_inv(get_weapon_data(self.object, "scope_name"))
- end
- if get_weapon_data(self.object, "is_attached_silencer") then
- spawn_item_in_inv(get_weapon_data(self.object, "silencer_name"))
- end
- if get_weapon_data(self.object, "is_attached_grenade_launcher") then
- spawn_item_in_inv(get_weapon_data(self.object, "grenade_launcher_name"))
- end
- self.object:unload_magazine()
- end
- remove_object(self.object:id())
- local obj = spawn_item_in_inv(section)
- level.client_spawn_manager():add(obj.id, 0,
- function(condition, id, obj)
- obj:set_condition(condition)
- if obj:is_weapon() then obj:set_ammo_elapsed(0) end
- self:update_object_data(obj)
- self:update_item_info()
- self:update_upgrade_cells()
- self.current_item.st_item_name:SetText(get_inventory_item_data(obj, "inv_name"))
- self.current_item.st_item_name:InitTexture("ui_beltweaponUpd")
- self.list_ids[self.current_index + 1] = id
- self.last_id = id
- end,
- self.condition)
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:Update()
- CUIScriptWnd.Update(self)
- --[[if self.object then
- if db.actor:is_in_slot(self.object) then
- self.current_item.st_item_name:SetTextColor(255, 100, 230, 100)
- else
- self.current_item.st_item_name:SetTextColor(255, 216, 186, 140)
- end
- end]]
- self.st_weight:SetText(self:weight_static())
- end
- ---------------------------------------------------------------------------------------------------
- function CUIUpgradeDialog:OnKeyboard(dik, keyboard_action)
- CUIScriptWnd.OnKeyboard(self, dik, keyboard_action)
- if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
- if dik == DIK_keys.DIK_ESCAPE or dik == bind_to_dik(key_bindings.kUSE) then
- self:on_button_exit(true)
- elseif dik == DIK_keys.DIK_R and self.btn_repair:IsEnabled() then
- self:on_button_repair()
- elseif dik == DIK_keys.DIK_U and self.btn_upgrade:IsEnabled() then
- self:on_button_upgrade()
- elseif dik == DIK_keys.MOUSE_1 then
- for k, v in pairs(self.btn_upgrade_cells) do
- if k and v and cursor_over_window(self, v) then
- self:on_button_upgrade_cell(self:get_upgrade_data(k, v:WindowName()), v:IsEnabled())
- break
- end
- end
- end
- end
- return true
- end
- --[[-----------------------------------------------------------------------------------------------
- * TALK DIALOG
- --]]-----------------------------------------------------------------------------------------------
- class "CUITalkDialog" (CUIScriptWnd)
- function CUITalkDialog:__init(obj) super()
- self:Init(0, 0, 1024, 768)
- self.ini = ini_file("misc\\upgrade_manager.ltx")
- self.object = obj
- self.profile_name = string.lower(self.object:profile_name())
- self.upgrade_mode = false
- self.mechanics = read_list("mechanics", self.ini)
- self.xml = CScriptXmlInit()
- self.xml:ParseFile("talk.xml")
- if self.profile_name ~= "osoznanie" then
- -- trade button
- self.btn_trade = self.xml:Init3tButton("trade_btn", level.get_talk_wnd())
- if self:check_mechanic() then
- self.btn_trade:SetTextST("ui_st_upgrade")
- self.upgrade_mode = true
- self:update_preconditions()
- end
- self:Register(self.btn_trade, "trade_button")
- self:AddCallback("trade_button", ui_events.BUTTON_CLICKED, self.on_button_trade, self)
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUITalkDialog:on_button_trade()
- if self.upgrade_mode then
- upgrade_dialog = CUIUpgradeDialog(self.object, self:get_mechanic_data(), self.ini)
- level.start_stop_menu(upgrade_dialog, true)
- db.actor:hide_weapon()
- db.actor:stop_talk()
- db.actor:give_info_portion("ui_upgrade")
- else
- db.actor:switch_to_trade()
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUITalkDialog:update_preconditions()
- if self.upgrade_mode then
- self.btn_trade:Enable(self:check_preconditions())
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUITalkDialog:check_mechanic()
- for k, v in pairs(self.mechanics) do
- if self.profile_name == string.lower(k) then
- return true
- end
- end
- end
- ---------------------------------------------------------------------------------------------------
- function CUITalkDialog:check_preconditions()
- local infoportions_precond = read_line(self.profile_name, "infoportions_precond", "string", self.ini)
- if infoportions_precond then
- local infoportions_table = string.split(infoportions_precond, ",")
- for k, v in pairs(infoportions_table) do
- if not has_alife_info(v) then
- return
- end
- end
- end
- return true
- end
- ---------------------------------------------------------------------------------------------------
- function CUITalkDialog:get_mechanic_data()
- local mechanic_data = {}
- mechanic_data.min_condition = read_line(self.profile_name, "min_condition", "number", self.ini, 0)
- mechanic_data.upgrade_min_condition = read_line(self.profile_name, "upgrade_min_condition", "number", self.ini, 0)
- mechanic_data.markup = read_line(self.profile_name, "markup", "number", self.ini, 1)
- mechanic_data.upgrade_markup = read_line(self.profile_name, "upgrade_markup", "number", self.ini, 1)
- return mechanic_data
- end
- --[[-----------------------------------------------------------------------------------------------
- * INIT
- --]]-----------------------------------------------------------------------------------------------
- function show_hide_menu(info_id)
- if info_id == "ui_talk" then
- if not talk_dialog then
- talk_dialog = CUITalkDialog(level.get_second_talker())
- end
- elseif info_id == "ui_talk_hide" then
- if talk_dialog then
- if talk_dialog.btn_trade then
- talk_dialog.btn_trade:DetachFromParent()
- end
- talk_dialog = nil
- end
- elseif talk_dialog then
- talk_dialog:update_preconditions()
- end
- end
- ---------------------------------------------------------------------------------------------------
- function get_upgrade_dialog()
- return upgrade_dialog
- end
Advertisement
Add Comment
Please, Sign In to add comment