---==================================================================================================---
--------------------------------------------------------------------------------------------------------
------------------------------------(Дополнительные функции)--------------------------------------------
--------------------------------------------------------------------------------------------------------
---==================================================================================================---
------------------------------------------------------------------------------
--                         Чтение секций .LTX                               --
------------------------------------------------------------------------------
-- 'Проверка сквада на его участие в войне группировок.
function ReadCommunityWarSquad(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"community_war_squad") then
      return ltx:r_bool(section,"community_war_squad")
   else
      return false
   end
end
-- 'Условие онлайн режима для НПС.
function ReadOnlineCond(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"online_cond") then
      return ltx:r_string(section,"online_cond")
   else
      return nil
   end
end
-- 'Чтения кода с карты доступа.
function ReadCodeId(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"code_id") then
      return ltx:r_string(section,"code_id")
   else
      return nil
   end
end
function ReadCodeTarget(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"code_target") then
      return ltx:r_string(section,"code_target")
   else
      return nil
   end
end
-- 'Замена ножа и бинокля в слоте.
function ReadActivateSection(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"activate_section") then
      return ltx:r_string(section,"activate_section")
   else
      return nil
   end
end
function ReadActivateKnife(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"activate_knife") then
      return ltx:r_string(section,"activate_knife")
   else
      return nil
   end
end
function ReadActivateBinocular(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"activate_binocular") then
      return ltx:r_string(section,"activate_binocular")
   else
      return nil
   end
end
-- 'Установка метки на обьект.
function ReadSpot(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"spot") then
      return ltx:r_string(section,"spot")
   else
      return nil
   end
end
-- 'Сквад предназначен для штурма
function ReadAssaultSquad(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"assault_squad") then
      return ltx:r_bool(section,"assault_squad")
   else
      return false
   end
end
-- 'Выдача инфопортации при использовании предмета
function ReadOnUseInfo(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"on_use_info") then
      return ltx:r_string(section,"on_use_info")
   else
      return nil
   end
end
-- 'Тип шлема.
function ReadHelmType(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"helm_type") then
      return ltx:r_string(section,"helm_type")
   else
      return "unknown"
   end
end
-- 'Тип брони.
function ReadOutfitType(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"outfit_type") then
      return ltx:r_string(section,"outfit_type")
   else
      return "unknown"
   end
end
-- 'Тип оружия.
function ReadWeaponType(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"weapon_type") then
      return ltx:r_string(section,"weapon_type")
   else
      return "unknown"
   end
end
-- 'Ящик со случайными боеприпасами.
function ReadThisIsAmmoContainer(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"this_is_ammo_container") then
      return ltx:r_bool(section,"this_is_ammo_container")
   else
      return false
   end
end
-- 'Путь к партиклу.
function ReadParticleName(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"particle_name") then
      return ltx:r_string(section,"particle_name")
   else
      return nil
   end
end
-- 'Название кости под сенью партикла.
function ReadParticleBone(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"particle_bone") then
      return ltx:r_string(section,"particle_bone")
   else
      return nil
   end
end
-- 'Звуковое сопроводление партикла.
function ReadParticleSound(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"particle_sound") then
      return ltx:r_string(section,"particle_sound")
   else
      return nil
   end
end
-- 'Продолжительность работы аккумулятора.
function ReadBatteryPower(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"battery_power") then
      return ltx:r_float(section,"battery_power")
   else
      return 0
   end
end
-- 'Время использования предмета.
function ReadActivationTime(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"activation_time") then
      return ltx:r_float(section,"activation_time")
   else
      return 0
   end
end
-- 'Дружба мутанта со сталкерами.
function ReadStalkersFriendly(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"stalkers_friendly") then
      return ltx:r_bool(section,"stalkers_friendly")
   else
      return false
   end
end
-- 'Дружба сталкера с мутантами.
function ReadMonstersFriendly(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"monsters_friendly") then
      return ltx:r_bool(section,"monsters_friendly")
   else
      return false
   end
end
-- 'Тип аномальность артефакта.
function ReadBreedingType(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"breeding_type") then
      return ltx:r_float(section,"breeding_type")
   else
      return nil
   end
end
-- 'Чувствительность мутанта к препарату X8П25.
function ReadCaptureConfirmed(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"capture_confirmed") then
      return ltx:r_bool(section,"capture_confirmed")
   else
      return true
   end
end
-- 'Радиус детекции артефактов на КПК. Относится к детекторам.
function ReadRadarArea(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"radar_area") then
      return ltx:r_float(section,"radar_area")
   else
      return -1
   end
end
-- 'Точность идентификации артефактов. Относится к детекторам.
function ReadRadarAccuracy(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"radar_accuracy") then
      return ltx:r_bool(section,"radar_accuracy")
   else
      return false
   end
end
-- 'Значение дальности обзора НПС.
function ReadEyeRange(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"eye_range") then
      return ltx:r_float(section,"eye_range")
   else
      return 80
   end
end
-- 'Радиус действия препарата X8П25.
function ReadCaptureMealRadius(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"capture_meal_radius") then
      return ltx:r_float(section,"capture_meal_radius")
   else
      return 10
   end
end
-- 'Время порабощения препарата X8П25.
function ReadCaptureMealControl(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"capture_meal_control") then
      return ltx:r_float(section,"capture_meal_control")
   else
      return 20
   end
end
-- 'Срок действия препарата X8П25 после вскрытия.
function ReadCaptureMealCharge(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"capture_meal_charge") then
      return ltx:r_float(section,"capture_meal_charge")
   else
      return 60
   end
end
-- 'Цель препарата X8П25
function ReadCaptureMealTarget(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"capture_meal_target") then
      return ltx:r_string(section,"capture_meal_target")
   else
      return "none"
   end
end
-- 'Включение ауры бездействия.
function ReadAuraInactivityActive(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"aura_inactivity_active") then
      return ltx:r_bool(section,"aura_inactivity_active")
   else
      return false
   end
end
-- 'Включение эффектов ауры бездействия.
function ReadAuraInactivityEffector(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"aura_inactivity_effector") then
      return ltx:r_bool(section,"aura_inactivity_effector")
   else
      return false
   end
end
-- 'Радиус ауры бездействия.
function ReadAuraInactivityRadius(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"aura_inactivity_radius") then
      return ltx:r_float(section,"aura_inactivity_radius")
   else
      return 10
   end
end
-- 'Частота ауры бездействия.
function ReadAuraInactivityFrequency(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"aura_inactivity_frequency") then
      return ltx:r_float(section,"aura_inactivity_frequency")
   else
      return 1000
   end
end
-- 'Инфопортация отключения ауры бездействия.
function ReadAuraInactivityDisableInfo(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"aura_inactivity_disable_info") then
      return ltx:r_string(section,"aura_inactivity_disable_info")
   else
      return "none"
   end
end
-- 'Сокровища группировок. Выдача инфопортации, при первом использовании ящика.
function ReadFirstSearchInfo(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"first_search_info") then
      return ltx:r_string(section,"first_search_info")
   else
      return "nil"
   end
end
-- 'Сокровища группировок. Метка ящика на КПК.
function ReadBaseTreasureSpot(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"base_treasure_spot") then
      return ltx:r_string(section,"base_treasure_spot")
   else
      return "nil"
   end
end
-- 'Сокровища группировок. Группировка к которой принадлежит ящик.
function ReadSelfCommunity(section)
   local ltx = system_ini()
   local value = ltx:r_string(section,"self_community")
   return value
end
-- 'Сокровища группировок. Группировка к которой должен принадлежать ГГ, чтоб он мог безнаказанно пользоваться ящиком.
function ReadNeedCommunity(section)
   local ltx = system_ini()
   local value = ltx:r_string(section,"need_community")
   return value
end
-- 'Сокровища группировок. Предметы в ящике.
function ReadBaseItems(section)
   local ltx = system_ini()
   local value = ltx:r_string(section,"base_items")
   return value
end
-- 'Сокровища группировок. Если ГГ не принадлежит к группировке need_community, тогда выдача инфопортации.
function ReadTakeItemsInfo(section)
   local ltx = system_ini()
   local value = ltx:r_string(section,"take_items_info")
   return value
end
-- 'Книга ТВБ. Инфопортация, получаемая после изучения ТВБ.
function GetSkillInfo(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"increasing_skill_info") then
      return ltx:r_string(section,"increasing_skill_info")
   else
      return "dont_skill"
   end
end
-- 'Книга ТВБ. Цель ТВБ.
function GetSkillTarget(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"skill_target") then
      return ltx:r_string(section,"skill_target")
   else
      return "wpn_knife"
   end
end
-- 'Книга ТВБ. Бонус к урону, после изучения ТВБ.
function GetSkillPoint(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"increasing_skill_point") then
      return ltx:r_float(section,"increasing_skill_point")
   else
      return 0.0
   end
end
-- 'Персональная флешка. Координаты хабара, по X.
function GetDeserveX(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"create_deserve_x")
   return value
end
-- 'Персональная флешка. Координаты хабара, по Y.
function GetDeserveY(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"create_deserve_y")
   return value
end
-- 'Персональная флешка. Координаты хабара, по Z.
function GetDeserveZ(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"create_deserve_z")
   return value
end
-- 'Персональная флешка. Координаты хабара, level_vertex.
function GetDeserveLV(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"create_deserve_lv")
   return value
end
-- 'Персональная флешка. Координаты хабара, game_vertex.
function GetDeserveGV(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"create_deserve_gv")
   return value
end
-- 'Персональная флешка. Заголовок в подписи метки хабара.
function GetDeserveTitle(section)
   local ltx = system_ini()
   local value = ltx:r_string(section,"deserve_title")
   return value
end
-- 'Персональная флешка. Текст в подписи метки хабара.
function GetDeserveDescr(section)
   local ltx = system_ini()
   local value = ltx:r_string(section,"deserve_descr")
   return value
end
-- 'Персональная флешка. Предметы хабара.
function GetDeserveItems(section)
   local ltx = system_ini()
   local value = ltx:r_string(section,"deserve_items")
   return value
end
-- 'Выдача денег. Случайное количество. От.
function ReadMoneyFrom(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"money_from")
   return value
end
-- 'Выдача денег. Случайное количество. До.
function ReadMoneyBefore(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"money_before")
   return value
end
-- 'Спальный мешок. Случайное время сна. От.
function GetSleepBagRandomA(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"random_sleep_a")
   return value
end
-- 'Спальный мешок. Случайное время сна. До.
function GetSleepBagRandomB(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"random_sleep_b")
   return value
end
-- 'После использования предмета, спаун другого предмета в инвентарь.
function ReadAfterUsedTransform(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"after_used_transform") then
      return ltx:r_string(section,"after_used_transform")
   else
      return nil
   end
end
-- 'При использовании ящика-инвентаря, выдача инфопортации.
function ReadInventoryUseInfo(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"inventory_use_info") then
      if ltx:r_string(section,"inventory_use_info")=="self" then
         return section.."_searched"
      else
         return ltx:r_string(section,"inventory_use_info")
      end
   else
      return "none"
   end
end
-- 'Выдача денег.
function ReadReceptionMoney(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"reception_money") then
      return ltx:r_float(section,"reception_money")
   else
      return 0
   end
end
-- 'Медаль ранга. Деньги за использование медали.
function GetMedalMoney(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"medal_money")
   return value
end
-- 'Деньги, которые можно извечь из трупа, при условии что получены утилиты для взлома КПК.
function ReadCorpseMoney(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"corpse_money") then
      return ltx:r_float(section,"corpse_money")
   else
      return 0
   end
end
-- 'Имеет ли обьект иммунитет к SGM минам.
function ReadAvoidMines(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"avoid_mines") then
      return ltx:r_bool(section,"avoid_mines")
   else
      return false
   end
end
-- 'Забирать ли труп НПС, под уборщик трупов, при соблюдении определенных условий.
function ReadAvailRelease(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"avail_release") then
      return ltx:r_bool(section,"avail_release")
   else
      return true
   end
end
-- 'Разрешение задержки после боя.
function ReadCombatExitDelay(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"combat_exit_delay") then
      return ltx:r_bool(section,"combat_exit_delay")
   else
      return true
   end
end
-- 'Будет ли НПС лежать на земле, будучи критически раненым.
function ReadCanBeWounded(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"can_be_wounded") then
      return ltx:r_bool(section,"can_be_wounded")
   else
      return true
   end
end
-- 'Будет ли НПС марадерствовать по трупам.
function ReadCorpseDetection(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"corpse_detection") then
      return ltx:r_bool(section,"corpse_detection")
   else
      return true
   end
end
-- 'Будет ли НПС искать оружие, которое лучше чем у него.
function ReadGatherDetection(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"gather_detection") then
      return ltx:r_bool(section,"gather_detection")
   else
      return true
   end
end
-- 'Будет ли НПС оказывать помощь раненым.
function ReadWoundedDetection(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"wounded_detection") then
      return ltx:r_bool(section,"wounded_detection")
   else
      return true
   end
end
-- 'Группировка обьекта.
function ReadCommunity(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"community") then
      return ltx:r_string(section,"community")
   else
      return nil
   end
end
-- 'Группировка сквада.
function ReadFaction(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"faction") then
      return ltx:r_string(section,"faction")
   else
      return nil
   end
end
-- 'SID обьекта.
function ReadStoryId(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"story_id") then
      return ltx:r_string(section,"story_id")
   else
      return nil
   end
end
-- 'Слот обьекта.
function GetItemSlot(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"slot") then
      return ltx:r_float(section,"slot")
   else
      return 0
   end
end
-- 'Путь к визуальной модельке.
function ReadVisual(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"visual") then
      return ltx:r_string(section,"visual")
   else
      return "nil"
   end
end
-- 'Путь к визуальной модельке.
function ReadActorVisual(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"actor_visual") then
      return ltx:r_string(section,"actor_visual")
   else
      return nil
   end
end
-- 'Путь к визуальной модели ГГ в шлеме.
function ReadActorVisualHelm(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"actor_visual_helm") then
      return ltx:r_string(section,"actor_visual_helm")
   else
      return nil
   end
end
-- 'Название предмета.
function ReadCaption(section)
   local ltx = system_ini()
   local value = ltx:r_string(section,"inv_name")
   return value
end
-- 'Описание предмета.
function ReadDescription(section)
   local ltx = system_ini()
   local value = ltx:r_string(section,"description")
   return value
end
-- 'Стоимость обьекта.
function ReadCost(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"cost") then
      return ltx:r_float(section,"cost")
   else
      return 0
   end
end
-- 'Вес предмета.
function ReadItemWeight(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"inv_weight") then
      return ltx:r_float(section,"inv_weight")
   else
      return 0.0
   end
end
-- 'Воздействие вредных токсинов.
function ReadEatToxicity(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"eat_toxicity") then
      return ltx:r_float(section,"eat_toxicity")
   else
      return 0.0
   end
end
-- 'Воздействие на пси-здоровье.
function ReadEatPsyHealth(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"eat_psy_health") then
      return ltx:r_float(section,"eat_psy_health")
   else
      return 0.0
   end
end
-- 'Длительность действия предмета.
function GetBoostTime(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"boost_time") then
      return ltx:r_float(section,"boost_time")
   else
      return 0
   end
end
-- 'Длительность действия предмета. Со множителем.
function GetBoostTimeMs(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"boost_time") then
      return ltx:r_float(section,"boost_time")*1150
   else
      return 0
   end
end
-- 'HUD элемент, для бронекостюма или противогаза.
function ReadHudCarryingOutfit(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"hud_carrying_outfit") then
      return ltx:r_string(section,"hud_carrying_outfit")
   else
      return "none"
   end
end
-- 'Имеет ли бронекостюм противогаз.
function ReadHasAntigas(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"has_antigas") then
      return ltx:r_bool(section,"has_antigas")
   else
      return false
   end
end
-- 'Свойство бронекостюма, повышать минимально переносимый вес.
function ReadAddWeight1(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"additional_inventory_weight")
   return value
end
-- 'Свойство бронекостюма, повышать максимально переносимый вес.
function ReadAddWeight2(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"additional_inventory_weight2")
   return value
end
-- 'Урон, наносимый оружием. Со множителем.
function ReadDamage(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"hit_power")
   return string.format(math.floor(value*100))
end
-- 'Урон, наносимый оружием.
function ReadDamage2(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"hit_power")
   return value
end
-- 'Дальность ведения огня, для оружия.
function ReadDistance(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"fire_distance")
   return value
end
-- 'Количество патронов, в магазине.
function ReadClip(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"ammo_mag_size")
   return value
end
-- 'Кратность приближения/отдаления оптического прицела.
function ReadZoom(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"scope_zoom_factor")
   return value
end
-- 'Статус поддержки апгрейда. Оптический прицел.
function ReadScopeUp(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"scope_status")
   return value
end
-- 'Статус поддержки апгрейда. Глушитель.
function ReadSilencerUp(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"silencer_status")
   return value
end
-- 'Статус поддержки апгрейда. Подствольный гранатомет.
function ReadLauncherUp(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"grenade_launcher_status")
   return value
end
-- 'Типы патронов, поддерживаемые оружием.
function ReadAmmoClass(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"ammo_class") then
      return ltx:r_string(section,"ammo_class")
   else
      return nil
   end
end
-- 'Количество патронов, в коробке с патронами.
function ReadAmmoSize(section)
   local ltx = system_ini()
   local value = ltx:r_float(section,"box_size")
   return value
end
------------------------------------------------------------------------------
--                      Сохранение переменных                               --
------------------------------------------------------------------------------
-- 'Управление pstor параметрами.
function edit_counter(counter_name,to_value,action)
   if read_variable(counter_name)~=nil then
      if (action==true or action=="true" or action=="+" or action=="plus" or action==nil) then
         local counter=read_variable(counter_name)
         write_variable(counter_name,counter+to_value)
      elseif (action==false or action=="false" or action=="-" or action=="minus") then
         local counter=read_variable(counter_name)
         write_variable(counter_name,counter-to_value)
      end
   end
end
-- 'Прибавить к pstor-счетчику цифру.
function inc_counter(counter_name,add_value)
   if read_variable(counter_name)==nil then write_variable(counter_name,0) end
   if add_value==nil then add_value=1 end
   if read_variable(counter_name)~=nil then
      local counter=read_variable(counter_name)
      write_variable(counter_name,counter+add_value)
   end
end
-- 'Отнять от pstor-счетчика цифру.
function dec_counter(counter_name,add_value)
   if read_variable(counter_name)==nil then write_variable(counter_name,0) end
   if add_value==nil then add_value=1 end
   if read_variable(counter_name)~=nil then
      local counter=read_variable(counter_name)
      write_variable(counter_name,counter-add_value)
   end
end
-- 'Восстанавление pstor параметра.
function set_safe_variable(variable_name,val)
   if read_variable(variable_name)==nil then
      if val==nil then
         write_variable(variable_name,0)
      else
         write_variable(variable_name,val)
      end
   end
end
-- 'Безопасная проверка наличия записи в pstor реестре.
function read_safe_variable(variable_name,type,equal_val)
   if type=="equal" then
      if read_variable(variable_name)~=nil and read_variable(variable_name)==equal_val then
         return true
      else
         return false
      end
   else
      if read_variable(variable_name)~=nil then
         return read_variable(variable_name)
      else
         return 0
      end
   end
end
-- 'Удаление pstor параметра.
function del_safe_variable(variable_name)
   if read_variable(variable_name)~=nil then
      clear_variable(variable_name)
   end
end
-- 'Запись pstor переменной, для обьекта.
function write_obj_variable(obj,params_name,value)
   if value==nil then
       clear_obj_variable(obj,params_name)
   else
       local opt=reload_params(params_name)
       pstor_store(obj,opt,value)
   end
end
-- 'Чтение pstor переменной, для обьекта.
function read_obj_variable(obj,params_name)
   local opt=reload_params(params_name)
   return pstor_retrieve(obj,opt)
end
-- 'Удаление pstor переменной, для обьекта.
function clear_obj_variable(obj,params_name,is_id)
   local obj_id
   if is_id==true then
      obj_id=obj
   else
      obj_id=obj:id()
   end
   local opt=reload_params(params_name)
   if db.storage[obj_id].pstor[opt] then
       db.storage[obj_id].pstor[opt]=nil
   end
end
-- 'Запись pstor переменной.
function write_variable(params_name,value)
   if value==nil then
       clear_variable(params_name)
   else
       local opt=reload_params(params_name)
       pstor_store(db.actor,opt,value)
   end
end
-- 'Чтение pstor переменной.
function read_variable(params_name)
   local opt=reload_params(params_name)
   return pstor_retrieve(db.actor,opt)
end
-- 'Удаление pstor переменной.
function clear_variable(params_name)
   local opt=reload_params(params_name)
   if db.storage[db.actor:id()].pstor[opt] then
      db.storage[db.actor:id()].pstor[opt]=nil
   end
end
function pstor_store(obj,varname,val)
   if obj==nil then return nil end
   local sub_id=obj:id()
   if db.storage[sub_id].pstor==nil then
      db.storage[sub_id].pstor={}
   end
   db.storage[sub_id].pstor[varname]=val
end
function pstor_retrieve(obj,varname)
   if obj==nil then return nil end
   local sub_id=obj:id()
   if db.storage[sub_id].pstor~=nil then
      local val=db.storage[sub_id].pstor[varname]
      if val~=nil then
         return val
      end
   end
   return nil
end
function reload_params(params)
   return params
end
------------------------------------------------------------------------------
--                          Для опций мода                                  --
------------------------------------------------------------------------------
function info_get_number(info,inversion)
   if info~=nil then
      if has_alife_info(info) then
         if inversion==true then
            result=0
         else
            result=1
         end
      else
         if inversion==true then
            result=1
         else
            result=0
         end
      end
   end
   return result
end
function info_get_boolean(info,inversion)
   if info~=nil then
      if has_alife_info(info) then
         if inversion==true then
            result=false
         else
            result=true
         end
      else
         if inversion==true then
            result=true
         else
            result=false
         end
      end
   end
   return result
end
function info_give_on_number(value,info,inversion)
   if value~=nil and info~=nil then
      if value==1 then
         if inversion==true then
            disable_info(info)
         else
            give_info(info)
         end
      else
         if inversion==true then
            give_info(info)
         else
            disable_info(info)
         end
      end
   end
end
function info_give_on_boolean(value,info,inversion)
   if value~=nil and info~=nil then
      if value==true then
         if inversion==true then
            disable_info(info)
         else
            give_info(info)
         end
      else
         if inversion==true then
            give_info(info)
         else
            disable_info(info)
         end
      end
   end
end
------------------------------------------------------------------------------
--                      Инвентарные функции                                 --
------------------------------------------------------------------------------
-- 'Проверить количество предметов одного типа.
function get_item_count(item_section)
   local actor=db.actor
   items_count=0
   item_sect=item_section
   actor:iterate_inventory(
   function(actor,item)
      local items=item:section()
      if items==item_sect then
         items_count=items_count+1
      end
   end,actor)
   return items_count
end
-- 'Удаление определенного количества предметов из обьекта.
function delete_some_items(victim,section,count)
   if victim:id()==db.actor:id() then
      news_manager.relocate_item(db.actor,"out",section,count)
   end
   victim:iterate_inventory(
   function(dummy, item)
      if count>0 and item:section()==section then
         remove_object_by_id(item:id())
         count=count-1
      end
   end,victim)
end
-- 'Посчитать полную стоимость предметов одного типа, в рюкзаке ГГ.
function consider_items_costs(item_name,flooring)
   if flooring==nil or flooring=="nil" then
      flooring=1
   end
   curert_cost=ReadCost(item_name)
   actor=db.actor
   items_count=0
   items_costs=0
   itemin=item_name
   actor:iterate_inventory(
   function(actor,item)
      local items=item:section()
      if items==itemin then
         items_count=items_count+1
         items_costs=items_costs+curert_cost
      end
   end,actor)
   return items_costs/flooring
end
------------------------------------------------------------------------------
--                       Для схем поведения                                 --
------------------------------------------------------------------------------
-- 'Установить анимацию тела НПС.
function set_state(npc,need_state,fast)
   if state_lib.states[need_state] then
      if state_mgr.get_state(npc)~=need_state and (fast==nil or fast==false or fast=="false") then
         state_mgr.set_state(npc,need_state)
      elseif state_mgr.get_state(npc)~=need_state and (fast==true or fast=="true") then
         state_mgr.set_state(npc,need_state,nil,nil,nil,{fast_set=true})
      end
   end
end
-- 'Установить анимацию тела НПС, и смотреть на значение.
function set_state_with_look(npc,need_state,look,fast)
   if state_lib.states[need_state] then
      if state_mgr.get_state(npc)~=need_state and (fast==nil or fast==false or fast=="false") then
         state_mgr.set_state(npc,need_state,nil,nil,look)
      elseif state_mgr.get_state(npc)~=need_state and (fast==true or fast=="true") then
         state_mgr.set_state(npc,need_state,nil,nil,look,{fast_set=true})
      end
   end
end
-- 'Установить анимацию тела НПС, и смотреть на ГГ.
function set_state_to_actor(npc,need_state,to_body)
   if state_lib.states[need_state] then
      if state_mgr.get_state(npc)~=need_state then
         if to_body==true then
            state_mgr.set_state(npc,need_state,nil,nil,{look_object=db.actor},{fast_set=true})
         else
            state_mgr.set_state(npc,need_state,nil,nil,{look_position=level.vertex_position(db.actor:level_vertex_id())},{fast_set=true})
         end
      end
   end
end
-- 'Установить анимацию тела НПС, и смотреть на левел вертекс.
function set_state_look_to(npc,need_state,t_vertex)
   if state_lib.states[need_state] then
      if state_mgr.get_state(npc)~=need_state and (t_vertex=="nil" or t_vertex==0) then
         state_mgr.set_state(npc,need_state)
      elseif state_mgr.get_state(npc)~=need_state and (t_vertex~="nil" and t_vertex~=0) then
         state_mgr.set_state(npc,need_state,nil,nil,{look_position=level.vertex_position(t_vertex)},{fast_set=true})
      end
   end
end
-- 'Установить анимацию тела НПС, и смотреть на обьект.
function set_state_look_to_obj(npc,need_state,target_obj)
   if state_lib.states[need_state] then
      if state_mgr.get_state(npc)~=need_state and (target_obj==nil or target_obj=="nil") then
         state_mgr.set_state(npc,need_state)
      elseif state_mgr.get_state(npc)~=need_state and (t_vertex~="nil" and t_vertex~=0) then
         state_mgr.set_state(npc,need_state,nil,nil,{look_object=level.object_by_id(target_obj:id())},{fast_set=true})
      end
   end
end
-- 'Отправить НПС на левел вертекс.
function send_npc_to(obj,target,x,y,z)
  if x~=nil and y~=nil and z~=nil then
     utils.send_to_nearest_accessible_vertex(obj,level.vertex_in_direction(target,vector():set(x,y,z),5))
  elseif x~=nil and y==nil and z==nil then
     utils.send_to_nearest_accessible_vertex(obj,level.vertex_in_direction(target,x,5))
  else
     utils.send_to_nearest_accessible_vertex(obj,level.vertex_in_direction(target,vector():set(0,0,0),5))
  end
end
-- 'Телепортация НПС к ГГ, если НПС слишком отдалился.
function set_npc_teleport_to_actor(npc)
  if dont_has_alife_info("guidebook_active") and distance_between_safe(db.actor,npc)>r_mod_params("number","bodyguard_teleport_dist",60) then
     for k,v in pairs(xr_bodyguard.bodyguards_config) do
        if npc:profile_name()==k and xr_bodyguard.bodyguards_config[k].avail_teleport==true then
           npc:set_npc_position(vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z))
	end
     end
  end
end
-- 'Телепортация НПС на левел вертекс.
function set_npc_teleport_to_home_position(npc,home_pos,bool)
  if home_pos~=0 and (bool==nil or bool=="true") then
     local param1=level.vertex_position(home_pos).x
     local param2=level.vertex_position(home_pos).y
     local param3=level.vertex_position(home_pos).z
     npc:set_npc_position(vector():set(param1,param2,param3))
  end
end
-- 'Остановиться и посмотреть на ГГ, во время диалога.
function npc_stop_on_talk(npc,bool)
  if npc:is_talking() and (bool==nil or bool=="true") then
     if state_mgr.get_state(npc)~="wait_trade" then
        state_mgr.set_state(npc,"wait_trade",nil,nil,{look_object=db.actor},{fast_set=true})
     end
  end
end
-- 'Перевод мутанта под схему поведения.
function mob_recapture(mob_obj)
   if not xr_logic.mob_captured(mob_obj) then
      xr_logic.mob_capture(mob_obj,true)
   end
end
-- 'Отправить мутанта на левел вертекс.
function mob_send_to(mob_obj,target)
   action(mob_obj,move(move.run_fwd,level.vertex_position(target)))
end
-- 'Заставить мутанта, смотреть на левел вертекс.
function mob_look_to(mob_obj,target)
   action(mob_obj,anim(anim.look_around),look(look.point,level.vertex_position(target)))
end
-- 'Телепортация мутанта к ГГ, если мутант слишком отдалился.
function mob_teleport_to_actor(mob_obj)
  if db.actor~=nil then
     if distance_between_safe(db.actor,mob_obj)>r_mod_params("number","monster_teleport_dist",60) then
        mob_obj:set_npc_position(vector():set(db.actor:position().x,db.actor:position().y,db.actor:position().z))
     end
  end
end
-- 'Телепортация мутанта на левел вертекс.
function mob_teleport_to_home_position(mob_obj,home_pos,bool)
  if home_pos~=0 and (bool==nil or bool=="true") then
     local param1=level.vertex_position(home_pos).x
     local param2=level.vertex_position(home_pos).y
     local param3=level.vertex_position(home_pos).z
     mob_obj:set_npc_position(vector():set(param1,param2,param3))
  end
end
------------------------------------------------------------------------------
--                                Другое                                    --
------------------------------------------------------------------------------
-- 'Работа с электронными деньгами.
function relocate_web_money(num,type,with_news,show_time)
   local web_money=read_mod_param("actor_web_money")
   if web_money==nil then web_money=0 end
   if db.actor then
      if type == "in" then
         write_mod_param("actor_web_money",web_money+num)
      elseif type == "out" then
         write_mod_param("actor_web_money",web_money-num)
      end
      if with_news==nil or with_news==true then
         news_manager.relocate_web_money(db.actor,type,num,show_time)
      end
   end
end
-- 'Извлечение денег из трупа.
function extract_money_from_corpse(npc) 
   local extract_value=0
   local npc_rank = ranks.get_obj_rank_name(npc)
   if has_alife_info("sgm_achievements_marauder") then
      if npc_rank~=nil then
         if ReadCorpseMoney(npc:section())==0 then
            if npc_rank=="novice" then extract_value=math.random(10,50)+math.random(5,25)
            elseif npc_rank=="experienced" then extract_value=math.random(20,100)+math.random(10,50)
            elseif npc_rank=="veteran" then extract_value=math.random(100,200)+math.random(50,100)
            elseif npc_rank=="master" then extract_value=math.random(200,500)+math.random(100,250)
            end
         else
            local achievement=ReadCorpseMoney(npc:section())/100*40
            extract_value=ReadCorpseMoney(npc:section())+achievement
         end
      end
   else
      if npc_rank~=nil then
         if ReadCorpseMoney(npc:section())==0 then
            if npc_rank=="novice" then extract_value=math.random(10,50)    
            elseif npc_rank=="experienced" then extract_value=math.random(20,100)  
            elseif npc_rank=="veteran" then extract_value=math.random(100,200) 
            elseif npc_rank=="master" then extract_value=math.random(200,500)  
            end
         else
            extract_value=ReadCorpseMoney(npc:section())
         end
      end
   end
   local bringed_money=math.floor(extract_value)
   relocate_web_money(bringed_money,"in",false)
   news_manager.send_tip(db.actor,bringed_money.." "..game.translate_string("st_bankir_ru"),0,"money",3000,nil,"st_loot_entry")
   inc_mod_param("stat_s_trupov",bringed_money)
end
-- 'Переброска предметов от одного обьекта к другому.
function relocate_items_with_inv_box(box,victim)
   local function calc(temp,item)
      if item~=nil then
         box:transfer_item(item,victim)
      end
   end
   box:iterate_inventory_box(calc,box)
end
-- 'Убил ли ГГ НПС.
function npc_killed_by_actor(npc_id)
   local currert_death=db.storage[npc_id].death
   return currert_death~=nil and currert_death.killer==db.actor:id()
end
-- 'Проверить группировку к которой относится ГГ.
function get_actor_community()
   if read_mod_param("stat_community")~=nil then
      return read_mod_param("stat_community")
   end
   return nil
end
-- 'Проверка на наличие сквадов в смарте.
function is_smart_empty(smart_name)
   if sim_board.get_sim_board().smarts_by_names[smart_name]~=nil and sim_board.get_sim_board():get_smart_population(sim_board.get_sim_board().smarts_by_names[smart_name])<=0 then
      return true
   end
   return false
end
function get_smart_squads(smart_name)
   return sim_board.get_sim_board():get_smart_population(sim_board.get_sim_board().smarts_by_names[smart_name])
end
-- 'Проверка на наличие сквадов в смарте относящихся к выбранной группировке.
function smart_community_is(smart_name,community,ignore_monster)
   return sim_board.get_sim_board():check_community_in_smart(smart_name,community,ignore_monster)
end
-- 'Проверка на наличие файла с секцией.
function ini_exist(ini,section,line,def_val)
   if utils.cfg_get_string(ini_file(ini),section,line,nil,false,"",def_val) then
      return true
   end
   return false
end
-- 'Чтение параметров из секций.
function cfg_get_string(ini,section,line,def_val)
   return utils.cfg_get_string(ini,section,line,nil,false,"",def_val)
end
function cfg_get_number(ini,section,line,def_val)
   return utils.cfg_get_number(ini,section,line,nil,false,def_val)
end
-- 'Проверка и выполнение действий {=-!}%+-=%
function check_section_condlist(ini,section,line,def_val,value_type)
   local d_value=""
   if def_val==nil then d_value="" else d_value=def_val end
   if value_type==nil or value_type=="string" then
      return xr_logic.pick_section_from_condlist(db.actor,db.actor,xr_logic.parse_condlist(nil,section,"condlist",sgm_functions.cfg_get_string(ini,section,line,d_value)))
   elseif value_type=="number" then
      return xr_logic.pick_section_from_condlist(db.actor,db.actor,xr_logic.parse_condlist(nil,section,"condlist",sgm_functions.cfg_get_number(ini,section,line,d_value)))
   end
end
function check_string_condlist(target_value,npc)
   if npc==nil then npc=db.actor end
   return xr_logic.pick_section_from_condlist(db.actor,npc,xr_logic.parse_condlist(nil,"check_section","condlist",target_value))
end
function execute_condlist(npc,section,value)
   if npc==nil then npc=db.actor end
   xr_logic.pick_section_from_condlist(db.actor,npc,xr_logic.parse_condlist(nil,section,"condlist",value))
end
-- 'Возвращение значений выставленных справа и слева от чёрточки. Cлужебная функция.
function get_side_stick_value(string,value_num)
   local s_string
   if string~=nil then
      s_string=utils.parse_params(string)
   else
      s_string=nil
   end
   if value_num==nil or s_string==nil then
      return s_string
   else
      return s_string[to_number(value_num)]
   end
end
-- 'Возвращение значений разделённых между собой чёрточкой. Например "значение 1|значение 2".
function check_section_stick(ini,section,line,def_val)
   local d_value=""
   if def_val==nil then d_value=nil else d_value=def_val end
   if ini==nil then
      return get_side_stick_value(section)
   end
   return get_side_stick_value(sgm_functions.cfg_get_string(ini,section,line,d_value))
end
-- 'Возвращение значений разделённых между собой запятой. Например "значение 1,значение 2".
function check_section_comma(ini,section,line,def_val,count)
   local d_value=""
   if def_val==nil then d_value=nil else d_value=def_val end
   if ini==nil then
      return parse_comma_names(section,line,true)
   end
   local p_line=sgm_functions.cfg_get_string(ini,section,line,d_value)
   if p_line~=nil then
      return parse_comma_names(p_line,count,true)
   else
      return nil
   end
end



-------------------------------------//Copyright GeJorge//-------------------------------------------------