Chcesz moda? Wal!

Regulamin forum
Dział "Tworzenie Modyfikacji" służy do zadawania pytań odnośnie tworzenia modyfikacji, edytowania plików gry, oraz pisania tzw. tutoriali, czyli poradników odnośnie modyfikowania gry.
Nie zadajemy tutaj pytań odnośnie modyfikacji gotowych (nie dyskutujemy o nich!), prócz prób ich połączenia etc.


Przy cytowaniu plików *.LTX stosować tag [SYNTAX="ini"], przy cytowaniu plików *.script [SYNTAX="lua"] a przy cytowaniu plików *.xml - [SYNTAX="xml"].

Re: Chcesz moda? Wal!

Postprzez janisz w 18 Maj 2010, 19:51

lukass napisał(a):@janisz, a jak sprawdziłeś, że te 4x to w rzeczywistości nie jest 4x?
Tutaj masz rewelacyjne celowniki - viewtopic.php?f=77&t=8660 - 'Scopes'

a no bardzo prosto
ulepszam SWU na celownik x5, zakładam PSO-1 (napisane jak wół x5) i co widzę?
że ktoś ze mnie robi wała
tak samo z x4, wystarczy ulepszyć FT i porównać z tym co pokazuje susat x4
znów kiszka
dlatego szukam poprawki co to poprawia
janisz
Kot

Posty: 6
Dołączenie: 19 Maj 2009, 21:00
Ostatnio był: 05 Maj 2019, 20:40
Kozaki: 0

Reklamy Google

Re: Chcesz moda? Wal!

Postprzez lukass w 18 Maj 2010, 23:48

SVD przed i po
ImageImage
SVU przed i po
ImageImage
FT przed i po
ImageImage
Susat 4x
Image

gdzie ta kiszka?

A generalnie zoom w broniach ustawiasz wartością 'scope_zoom_factor' w pliku broni (ltx). Tą samą wartość możesz zmienić dla broni po tuningu w pliku broni w katalogu weapons/upgrades.
Mam pirata!
Awatar użytkownika
lukass
Ekspert

Posty: 827
Dołączenie: 25 Paź 2009, 13:18
Ostatnio był: 07 Sie 2010, 12:16
Ulubiona broń: --
Kozaki: 45

Re: Chcesz moda? Wal!

Postprzez janisz w 19 Maj 2010, 10:40

no sam sobie częściowo odpowiedziałeś
porównaj FT po ulepszeniu (ma mieć x4) i susat x4
to samo?
bo ja widzę że susat nie przybliża tak jak FT x4
tak samo jest z PSO-1
powinien dawać takie samo zbliżenie jak dake swu po modyfikacji (x5)
a daje?
poza tym już znalazłem coś takiego http://stalker.filefront.com/file/COP_Scope_Magnification_Fix;111971
tu jest tak jak powinno być, z tego co udało mi się sprawdzić, tylko IL nie ma x4 tak jak jest napisane w opisie broni, tylko mniej
EDIT
właśnie doczytałem, ze w stalkerze twórcy najwyraźniej z rozmysłem zaniżyli przybliżenie wszystkich celowników
trochę to robienie z ludzi wała
myślałem, ze to bug, lub niedopatrzenie (w CN też tak było i też mnie to wnerwiało), a okazuje się że zrobili to z pełną premedytacją
mogli by jednak nie pisać że (np.) SUSAT jest x4 tylko zgodnie z prawdą (w grze) że jest x2
janisz
Kot

Posty: 6
Dołączenie: 19 Maj 2009, 21:00
Ostatnio był: 05 Maj 2019, 20:40
Kozaki: 0

Re: Chcesz moda? Wal!

Postprzez lukass w 21 Maj 2010, 19:14

To teraz ja mam pytanie: czy taki bład może być spowodowany TYLKO I WYŁĄCZNIE błędem w tagu?

[error]Description : XML file:text\pol\sgm_descr_weapons.xml value: errDescr:Error reading end tag.

EDIT
Problem rozwiązany.
Mam pirata!
Awatar użytkownika
lukass
Ekspert

Posty: 827
Dołączenie: 25 Paź 2009, 13:18
Ostatnio był: 07 Sie 2010, 12:16
Ulubiona broń: --
Kozaki: 45

Re: Chcesz moda? Wal!

Postprzez Najemnik_Ara w 31 Maj 2010, 22:00

JA chce moda który zmieni swoją początkową frakcje na frakcje najemników i żeby najemnicy byli dobrzy :E

z góry thx!!!!!
Image
Awatar użytkownika
Najemnik_Ara
Kot

Posty: 37
Dołączenie: 19 Gru 2009, 23:32
Ostatnio był: 28 Sie 2013, 15:33
Miejscowość: bar "100 radów"
Frakcja: Grzech
Ulubiona broń: TRs 301
Kozaki: -1

Re: Chcesz moda? Wal!

Postprzez wwwdjkamil w 02 Cze 2010, 12:57

Poproszę o skonwertowanie http://forum.stalker.pl/viewtopic.php?f=49&t=9107 < tego moda do Zewu Prypeci
:

Ludzka ciekawość nie zna granic
Awatar użytkownika
wwwdjkamil
Kot

Posty: 26
Dołączenie: 19 Lut 2010, 22:40
Ostatnio był: 25 Lip 2024, 13:25
Frakcja: Czyste Niebo
Ulubiona broń: GP 37
Kozaki: 1

Re: Chcesz moda? Wal!

Postprzez impulse_101 w 12 Cze 2010, 14:22

Mam konflikt z plikami miedzy "[AtmosFear] Cromm Cruac" i "Wladca zony". Problem polega na tym ze Wladca zony mial menu po nacisnieciu F1 a po w graniu [AtmosFear] opcja zniknela, poza brakiem menu z wladcy reszta gry dziala ok. Konflikt wystepuje w ui_main_menu.script i mozliwe ze jeszcze w pliku xr_conditions.script . Probowalem sam to poprawic ale gdzies robie blad w kodzie i gra sie sypie.

ui_main_menu.script z Wladcy zony
:

Kod: Zaznacz wszystko
-- File:        UI_MAIN_MENU.SCRIPT
-- Description: Load Dialog for STALKER
-- Created:     28.10.2004
-- Lasd edit:   18.01.2006
-- Copyright:   2004 GSC Game World
-- Author:      Serhiy Vynnychenko ([email protected])
-- Version:     0.9

class "main_menu" (CUIScriptWnd)

function main_menu:__init() super()
   self.mbox_mode = 0
    self:InitControls()
    self:InitCallBacks()
    xr_s.on_main_menu_on()                        --' Distemper 03.2008 --
end

function main_menu:__finalize()
end

function main_menu:InitControls()
   self:SetWndRect               (Frect():set(0,0,1024,768))

    local xml                  = CScriptXmlInit()
    xml:ParseFile               ("ui_mm_main.xml")

    xml:InitStatic               ("background", self)
    self.shniaga               = xml:InitMMShniaga("shniaga_wnd",self);

   self.message_box            = CUIMessageBoxEx()
   self:Register               (self.message_box, "msg_box")

   local _ver = xml:InitStatic      ("static_version",self)
   local mm                  = _G.main_menu.get_main_menu()
   _ver:TextControl():SetText      ("ver. " .. mm:GetGSVer())

    self.l_mgr = mm:GetLoginMngr()
    self.acc_mgr = mm:GetAccountMngr()
    self.profile_store = mm:GetProfileStore()
    self.gs_profile = self.l_mgr:get_current_profile()
   
    if (self.gs_profile and not(level.present())) then
      self.shniaga:ShowPage(CUIMMShniaga.epi_new_network_game) --fake
      self.shniaga:SetPage(CUIMMShniaga.epi_main, "ui_mm_main.xml", "menu_main_logout")
      self.shniaga:ShowPage(CUIMMShniaga.epi_main)
    end
end

function main_menu:Show(f)
   self.shniaga:SetVisibleMagnifier(f)
end


function main_menu:InitCallBacks()
   -- new game
   self:AddCallback("btn_novice",      ui_events.BUTTON_CLICKED,            self.OnButton_new_novice_game,      self)
   self:AddCallback("btn_stalker",      ui_events.BUTTON_CLICKED,            self.OnButton_new_stalker_game,      self)
   self:AddCallback("btn_veteran",      ui_events.BUTTON_CLICKED,            self.OnButton_new_veteran_game,      self)
   self:AddCallback("btn_master",      ui_events.BUTTON_CLICKED,            self.OnButton_new_master_game,      self)
   self:AddCallback("btn_spawn",      ui_events.BUTTON_CLICKED,            self.OnButton_load_spawn,         self)
   -- options
   self:AddCallback("btn_options",     ui_events.BUTTON_CLICKED,            self.OnButton_options_clicked,      self)
   -- load
   self:AddCallback("btn_load",        ui_events.BUTTON_CLICKED,            self.OnButton_load_clicked,         self)
   -- save
   self:AddCallback("btn_save",      ui_events.BUTTON_CLICKED,            self.OnButton_save_clicked,         self)
   -- multiplayer
   
   self:AddCallback("btn_net_game",   ui_events.BUTTON_CLICKED,            self.OnButton_network_game_clicked,   self)
   self:AddCallback("btn_internet",   ui_events.BUTTON_CLICKED,            self.OnButton_internet_clicked,      self)
   self:AddCallback("btn_localnet",   ui_events.BUTTON_CLICKED,            self.OnButton_localnet_clicked,      self)
   self:AddCallback("btn_multiplayer", ui_events.BUTTON_CLICKED,            self.OnButton_multiplayer_clicked,   self)
   self:AddCallback("btn_logout",      ui_events.BUTTON_CLICKED,            self.OnButton_logout_clicked,      self)
   
   -- quit
   self:AddCallback("btn_quit",      ui_events.BUTTON_CLICKED,            self.OnButton_quit_clicked,         self)
   self:AddCallback("btn_quit_to_mm",   ui_events.BUTTON_CLICKED,            self.OnButton_disconnect_clicked,   self)
   self:AddCallback("btn_ret",         ui_events.BUTTON_CLICKED,            self.OnButton_return_game,         self)
   self:AddCallback("btn_lastsave",   ui_events.BUTTON_CLICKED,            self.OnButton_last_save,         self)
   self:AddCallback("btn_credits",      ui_events.BUTTON_CLICKED,            self.OnButton_credits_clicked,      self)
   -- message box
   self:AddCallback("msg_box",     ui_events.MESSAGE_BOX_OK_CLICKED,      self.OnMsgOk,                  self)
   self:AddCallback("msg_box",     ui_events.MESSAGE_BOX_CANCEL_CLICKED,   self.OnMsgCancel,               self)
   self:AddCallback("msg_box",     ui_events.MESSAGE_BOX_YES_CLICKED,      self.OnMsgYes,                  self)
   self:AddCallback("msg_box",     ui_events.MESSAGE_BOX_NO_CLICKED,      self.OnMsgNo,                  self)
   self:AddCallback("msg_box",         ui_events.MESSAGE_BOX_QUIT_GAME_CLICKED,self.OnMessageQuitGame,            self)
   self:AddCallback("msg_box",         ui_events.MESSAGE_BOX_QUIT_WIN_CLICKED,   self.OnMessageQuitWin,            self)
end
function main_menu:OnMsgOk()
   self.mbox_mode = 0
end

function main_menu:OnMsgCancel()
   self.mbox_mode = 0
end

function main_menu:OnMsgYes()

   if    self.mbox_mode == 1 then
      self:LoadLastSave()
   end

   self.mbox_mode = 0
end

function main_menu:OnMsgNo()
   self.mbox_mode = 0
end

function main_menu:LoadLastSave()
   local               console = get_console()
   console:execute         ("main_menu off")
   console:execute         ("load_last_save")
end

function main_menu:OnButton_last_save()
   if ( alife() == nil) then
      self:LoadLastSave   ()
      return
   end

   if ( (db.actor ~= nil) and (db.actor:alive() == false) ) then
      self:LoadLastSave   ()
      return
   end

   self.mbox_mode         = 1
   self.message_box:InitMessageBox   ("message_box_confirm_load_save")
   self.message_box:ShowDialog(true)
end

function main_menu:OnButton_credits_clicked()
--   local console = get_console()
--   console:execute("main_menu off")
   game.start_tutorial("credits_seq")
end

function main_menu:OnButton_quit_clicked()
   self.message_box:InitMessageBox("message_box_quit_windows")
   self.message_box:ShowDialog(true)
end


function main_menu:OnButton_disconnect_clicked()
   self.message_box:InitMessageBox("message_box_quit_game")

   if (level.game_id() ~= 1) then
      self.message_box:SetText("ui_mm_disconnect_message")   -- MultiPlayer
   else
      self.message_box:SetText("ui_mm_quit_game_message")      -- SinglePlayer
   end
   self.message_box:ShowDialog(true)
end

function main_menu:OnMessageQuitGame()
   local console = get_console()
   console:execute("disconnect")
end

function main_menu:OnMessageQuitWin()
   local console = get_console()
   console:execute("quit")
end

function main_menu:OnButton_return_game()
   local console = get_console()
   console:execute("main_menu off")
   xr_s.on_main_menu_off()                        --' Distemper 03.2008 --
end

function main_menu:OnButton_new_novice_game()
   local console = get_console()
   console:execute("g_game_difficulty gd_novice")
   self:StartGame()
end

function main_menu:OnButton_new_stalker_game()
   local console = get_console()
   console:execute("g_game_difficulty gd_stalker")
   self:StartGame()
end

function main_menu:OnButton_new_veteran_game()
   local console = get_console()
   console:execute("g_game_difficulty gd_veteran")
   self:StartGame()
end

function main_menu:OnButton_new_master_game()
   local console = get_console()
   console:execute("g_game_difficulty gd_master")
   self:StartGame()
end

function main_menu:StartGame()
   local console = get_console()

   if (alife() ~= nil) then
      console:execute   ("disconnect")
   end
   device():pause(false)
   console:execute("start server(all/single/alife/new) client(localhost)")
   console:execute("main_menu off")
end

function main_menu:OnButton_load_spawn()
   self.god_dlg = ui_god_dialog.god_dialog()
   self.god_dlg.owner = self

   self.god_dlg:FillList()
   self.god_dlg:ShowDialog(true)
   self:HideDialog()
   self:Show(false)
end

function main_menu:OnButton_save_clicked()
   if self.save_dlg == nil then
      self.save_dlg = ui_save_dialog.save_dialog()
      self.save_dlg.owner = self
   end

   self.save_dlg:FillList()
   self.save_dlg:ShowDialog(true)
   self:HideDialog()
   self:Show(false)
end

function main_menu:OnButton_options_clicked()
   if self.opt_dlg == nil then
      self.opt_dlg = ui_mm_opt_main.options_dialog()
      self.opt_dlg.owner = self
   end

   self.opt_dlg:SetCurrentValues()
   self.opt_dlg:ShowDialog(true)
   self:HideDialog()
   self:Show(false)
end
 --'Ďîâĺëčňĺëü Çîíű 5.0'--
function main_menu:OnButton_load_clicked()
   self.load_dlg = ui_load_dialog.load_dialog()
   self.load_dlg.owner = self

   self.load_dlg:FillList()
   self.load_dlg:ShowDialog(true)
   self:HideDialog()
   self:Show(false)
end
 --'Ďîâĺëčňĺëü Çîíű 5.0'--

function main_menu:OnButton_network_game_clicked()
   self.shniaga:ShowPage(CUIMMShniaga.epi_new_network_game)
end

function main_menu:OnButton_multiplayer_clicked()
   -- assert(self.gs_profile)

   if not(self.mp_dlg) then
        self.mp_dlg = ui_mp_main.mp_main(self.gs_profile:online())
        self.mp_dlg.owner = self
      self.mp_dlg:OnRadio_NetChanged()
      if (self.mp_dlg.online) then
         self.mp_dlg.dlg_profile:InitBestScores()
         self.mp_dlg.dlg_profile:FillRewardsTable()
      end
    end
    self.mp_dlg:UpdateControls()
    self.mp_dlg:ShowDialog(true)

    self:HideDialog()
   self:Show(false)

   local console         = get_console()
   console:execute         ("check_for_updates 0")
end

function main_menu:OnButton_logout_clicked()
   -- assert(self.gs_profile)
   self.shniaga:ShowPage(CUIMMShniaga.epi_new_network_game) --fake
   self.l_mgr:logout()
   self.gs_profile = nil
   self.mp_dlg      = nil
   self.shniaga:SetPage(CUIMMShniaga.epi_main, "ui_mm_main.xml", "menu_main")
   self.shniaga:ShowPage(CUIMMShniaga.epi_main)
end

function main_menu:OnButton_internet_clicked()
    if not(self.gs_dlg) then
        self.gs_dlg = ui_mm_mp_gamespy.gamespy_page()
        self.gs_dlg.owner = self
    end
    self.gs_dlg:ShowLoginPage()
    self.gs_dlg:ShowDialog(true)
   
   self:HideDialog()
   self:Show(false)

   local console         = get_console()
   console:execute         ("check_for_updates 0")
end

function main_menu:OnButton_localnet_clicked()
   if not(self.ln_dlg) then
        self.ln_dlg = ui_mm_mp_localnet.localnet_page()
        self.ln_dlg.owner = self
        self.ln_dlg.lp_nickname:SetText(self.l_mgr:get_nick_from_registry())
        self.ln_dlg.lp_check_remember_me:SetCheck(self.l_mgr:get_remember_me_from_registry())
    end
    self.ln_dlg:ShowDialog(true)
   
   self:HideDialog()
   self:Show(false)

   local console         = get_console()
   console:execute         ("check_for_updates 0")
end

function main_menu:Dispatch(cmd, param)  --virtual function
   if cmd == 2 then
      self:OnButton_multiplayer_clicked()
   end
   return true
end

function main_menu:OnKeyboard(dik, keyboard_action)  --virtual function
   CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
   local bind = dik_to_bind(dik)
   local console = get_console()

   if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
      if dik == DIK_keys.DIK_ESCAPE then
         if level.present() and
            (   ((db.actor ~= nil)and(db.actor:alive())) or
               (false==IsGameTypeSingle())
            ) then
            self.OnButton_return_game()                      --' xStream 02.2008
            -- console:execute("main_menu off")                        --' xStream 02.2008
         end
      end

                  --'Ďîâĺëčňĺëü Çîíű 5.0'--
      if dik == DIK_keys.DIK_F1 then
                if db.actor then
         self:OnButton_load_spawn()
                end
      end
                  --'Ďîâĺëčňĺëü Çîíű 5.0'--

      if dik == DIK_keys.DIK_Q then
         self:OnMessageQuitWin()
      end

                  --'Ďîâĺëčňĺëü Çîíű 5.0'--
               god.key_binder(dik, keyboard_action, self)
                  --'Ďîâĺëčňĺëü Çîíű 5.0'--
   end

   return true
end


ui_main_menu.script z [AtmosFear] Cromm Cruac
:

Kod: Zaznacz wszystko
-- File:        UI_MAIN_MENU.SCRIPT
-- Description: Load Dialog for STALKER
-- Created:     28.10.2004
-- Lasd edit:   18.01.2006
-- Copyright:   2004 GSC Game World
-- Author:      Serhiy Vynnychenko ([email protected])
-- Version:     0.9

class "main_menu" (CUIScriptWnd)

function main_menu:__init() super()
   self.mbox_mode = 0
    self:InitControls()
    self:InitCallBacks()
    xr_s.on_main_menu_on()                        --' Distemper 03.2008 --
end

function main_menu:__finalize()
end

function main_menu:InitControls()
   self:SetWndRect               (Frect():set(0,0,1024,768))

    local xml                  = CScriptXmlInit()
    xml:ParseFile               ("ui_mm_main.xml")

    xml:InitStatic               ("background", self)
    self.shniaga               = xml:InitMMShniaga("shniaga_wnd",self);

   self.message_box            = CUIMessageBoxEx()
   self:Register               (self.message_box, "msg_box")

   local _ver = xml:InitStatic      ("static_version",self)
   local mm                  = _G.main_menu.get_main_menu()
   _ver:TextControl():SetText      ("ver. " .. mm:GetGSVer())

    self.l_mgr = mm:GetLoginMngr()
    self.acc_mgr = mm:GetAccountMngr()
    self.profile_store = mm:GetProfileStore()
    self.gs_profile = self.l_mgr:get_current_profile()
   
    if (self.gs_profile and not(level.present())) then
      self.shniaga:ShowPage(CUIMMShniaga.epi_new_network_game) --fake
      self.shniaga:SetPage(CUIMMShniaga.epi_main, "ui_mm_main.xml", "menu_main_logout")
      self.shniaga:ShowPage(CUIMMShniaga.epi_main)
    end
end

function main_menu:Show(f)
   self.shniaga:SetVisibleMagnifier(f)
end


function main_menu:InitCallBacks()
   -- new game
   self:AddCallback("btn_novice",      ui_events.BUTTON_CLICKED,            self.OnButton_new_novice_game,      self)
   self:AddCallback("btn_stalker",      ui_events.BUTTON_CLICKED,            self.OnButton_new_stalker_game,      self)
   self:AddCallback("btn_veteran",      ui_events.BUTTON_CLICKED,            self.OnButton_new_veteran_game,      self)
   self:AddCallback("btn_master",      ui_events.BUTTON_CLICKED,            self.OnButton_new_master_game,      self)
   self:AddCallback("btn_spawn",      ui_events.BUTTON_CLICKED,            self.OnButton_load_spawn,         self)
   -- options
   self:AddCallback("btn_options",     ui_events.BUTTON_CLICKED,            self.OnButton_options_clicked,      self)
   -- load
   self:AddCallback("btn_load",        ui_events.BUTTON_CLICKED,            self.OnButton_load_clicked,         self)
   -- save
   self:AddCallback("btn_save",      ui_events.BUTTON_CLICKED,            self.OnButton_save_clicked,         self)
   -- multiplayer
   
   self:AddCallback("btn_net_game",   ui_events.BUTTON_CLICKED,            self.OnButton_network_game_clicked,   self)
   self:AddCallback("btn_internet",   ui_events.BUTTON_CLICKED,            self.OnButton_internet_clicked,      self)
   self:AddCallback("btn_localnet",   ui_events.BUTTON_CLICKED,            self.OnButton_localnet_clicked,      self)
   self:AddCallback("btn_multiplayer", ui_events.BUTTON_CLICKED,            self.OnButton_multiplayer_clicked,   self)
   self:AddCallback("btn_logout",      ui_events.BUTTON_CLICKED,            self.OnButton_logout_clicked,      self)
   
   -- quit
   self:AddCallback("btn_quit",      ui_events.BUTTON_CLICKED,            self.OnButton_quit_clicked,         self)
   self:AddCallback("btn_quit_to_mm",   ui_events.BUTTON_CLICKED,            self.OnButton_disconnect_clicked,   self)
   self:AddCallback("btn_ret",         ui_events.BUTTON_CLICKED,            self.OnButton_return_game,         self)
   self:AddCallback("btn_lastsave",   ui_events.BUTTON_CLICKED,            self.OnButton_last_save,         self)
   self:AddCallback("btn_credits",      ui_events.BUTTON_CLICKED,            self.OnButton_credits_clicked,      self)
   -- message box
   self:AddCallback("msg_box",     ui_events.MESSAGE_BOX_OK_CLICKED,      self.OnMsgOk,                  self)
   self:AddCallback("msg_box",     ui_events.MESSAGE_BOX_CANCEL_CLICKED,   self.OnMsgCancel,               self)
   self:AddCallback("msg_box",     ui_events.MESSAGE_BOX_YES_CLICKED,      self.OnMsgYes,                  self)
   self:AddCallback("msg_box",     ui_events.MESSAGE_BOX_NO_CLICKED,      self.OnMsgNo,                  self)
   self:AddCallback("msg_box",         ui_events.MESSAGE_BOX_QUIT_GAME_CLICKED,self.OnMessageQuitGame,            self)
   self:AddCallback("msg_box",         ui_events.MESSAGE_BOX_QUIT_WIN_CLICKED,   self.OnMessageQuitWin,            self)
end
function main_menu:OnMsgOk()
   self.mbox_mode = 0
end

function main_menu:OnMsgCancel()
   self.mbox_mode = 0
end

function main_menu:OnMsgYes()

   if    self.mbox_mode == 1 then
      self:LoadLastSave()
   end

   self.mbox_mode = 0
end

function main_menu:OnMsgNo()
   self.mbox_mode = 0
end

function main_menu:LoadLastSave()
   local               console = get_console()
   console:execute         ("main_menu off")
   console:execute         ("load_last_save")
end

function main_menu:OnButton_last_save()
   if ( alife() == nil) then
      self:LoadLastSave   ()
      return
   end

   if ( (db.actor ~= nil) and (db.actor:alive() == false) ) then
      self:LoadLastSave   ()
      return
   end

   self.mbox_mode         = 1
   self.message_box:InitMessageBox   ("message_box_confirm_load_save")
   self.message_box:ShowDialog(true)
end

function main_menu:OnButton_credits_clicked()
--   local console = get_console()
--   console:execute("main_menu off")
   game.start_tutorial("credits_seq")
end

function main_menu:OnButton_quit_clicked()
   self.message_box:InitMessageBox("message_box_quit_windows")
   self.message_box:ShowDialog(true)
end


function main_menu:OnButton_disconnect_clicked()
   self.message_box:InitMessageBox("message_box_quit_game")

   if (level.game_id() ~= 1) then
      self.message_box:SetText("ui_mm_disconnect_message")   -- MultiPlayer
   else
      self.message_box:SetText("ui_mm_quit_game_message")      -- SinglePlayer
   end
   self.message_box:ShowDialog(true)
end

function main_menu:OnMessageQuitGame()
   local console = get_console()
   console:execute("disconnect")
end

function main_menu:OnMessageQuitWin()
   local console = get_console()
   console:execute("quit")
end

function main_menu:OnButton_return_game()
   local console = get_console()
   console:execute("main_menu off")
   xr_s.on_main_menu_off()                        --' Distemper 03.2008 --
end

function main_menu:OnButton_new_novice_game()
   local console = get_console()
   console:execute("g_game_difficulty gd_novice")
   self:StartGame()
end

function main_menu:OnButton_new_stalker_game()
   local console = get_console()
   console:execute("g_game_difficulty gd_stalker")
   self:StartGame()
end

function main_menu:OnButton_new_veteran_game()
   local console = get_console()
   console:execute("g_game_difficulty gd_veteran")
   self:StartGame()
end

function main_menu:OnButton_new_master_game()
   local console = get_console()
   console:execute("g_game_difficulty gd_master")
   self:StartGame()
end

function main_menu:StartGame()
   local console = get_console()

   if (alife() ~= nil) then
      console:execute   ("disconnect")
   end
   device():pause(false)
   console:execute("start server(all/single/alife/new) client(localhost)")
   console:execute("main_menu off")
end

function main_menu:OnButton_load_spawn()
   if self.spawn_dlg == nil then
      self.spawn_dlg = ui_spawn_dialog.spawn_dialog()
      self.spawn_dlg.owner = self
   end

   self.spawn_dlg:ShowDialog(true)
   self:HideDialog()
   self:Show(false)
end

function main_menu:OnButton_save_clicked()
   if self.save_dlg == nil then
      self.save_dlg = ui_save_dialog.save_dialog()
      self.save_dlg.owner = self
   end

   self.save_dlg:FillList()
   self.save_dlg:ShowDialog(true)
   self:HideDialog()
   self:Show(false)
end

function main_menu:OnButton_options_clicked()
   if self.opt_dlg == nil then
      self.opt_dlg = ui_mm_opt_main.options_dialog()
      self.opt_dlg.owner = self
   end

   self.opt_dlg:SetCurrentValues()
   self.opt_dlg:ShowDialog(true)
   self:HideDialog()
   self:Show(false)
end

function main_menu:OnButton_load_clicked()
   if self.load_dlg ==nil then
      self.load_dlg = ui_load_dialog.load_dialog()
      self.load_dlg.owner = self
   end

   self.load_dlg:FillList()
   self.load_dlg:ShowDialog(true)
   self:HideDialog()
   self:Show(false)
end

function main_menu:OnButton_network_game_clicked()
   self.shniaga:ShowPage(CUIMMShniaga.epi_new_network_game)
end

function main_menu:OnButton_multiplayer_clicked()
   -- assert(self.gs_profile)

   if not(self.mp_dlg) then
        self.mp_dlg = ui_mp_main.mp_main(self.gs_profile:online())
        self.mp_dlg.owner = self
      self.mp_dlg:OnRadio_NetChanged()
      if (self.mp_dlg.online) then
         self.mp_dlg.dlg_profile:InitBestScores()
         self.mp_dlg.dlg_profile:FillRewardsTable()
      end
    end
    self.mp_dlg:UpdateControls()
    self.mp_dlg:ShowDialog(true)

    self:HideDialog()
   self:Show(false)

   local console         = get_console()
   console:execute         ("check_for_updates 0")
end

function main_menu:OnButton_logout_clicked()
   -- assert(self.gs_profile)
   self.shniaga:ShowPage(CUIMMShniaga.epi_new_network_game) --fake
   self.l_mgr:logout()
   self.gs_profile = nil
   self.mp_dlg      = nil
   self.shniaga:SetPage(CUIMMShniaga.epi_main, "ui_mm_main.xml", "menu_main")
   self.shniaga:ShowPage(CUIMMShniaga.epi_main)
end

function main_menu:OnButton_internet_clicked()
    if not(self.gs_dlg) then
        self.gs_dlg = ui_mm_mp_gamespy.gamespy_page()
        self.gs_dlg.owner = self
    end
    self.gs_dlg:ShowLoginPage()
    self.gs_dlg:ShowDialog(true)
   
   self:HideDialog()
   self:Show(false)

   local console         = get_console()
   console:execute         ("check_for_updates 0")
end

function main_menu:OnButton_localnet_clicked()
   if not(self.ln_dlg) then
        self.ln_dlg = ui_mm_mp_localnet.localnet_page()
        self.ln_dlg.owner = self
        self.ln_dlg.lp_nickname:SetText(self.l_mgr:get_nick_from_registry())
        self.ln_dlg.lp_check_remember_me:SetCheck(self.l_mgr:get_remember_me_from_registry())
    end
    self.ln_dlg:ShowDialog(true)
   
   self:HideDialog()
   self:Show(false)

   local console         = get_console()
   console:execute         ("check_for_updates 0")
end

function main_menu:Dispatch(cmd, param)  --virtual function
   if cmd == 2 then
      self:OnButton_multiplayer_clicked()
   end
   return true
end

function main_menu:OnKeyboard(dik, keyboard_action)  --virtual function
   CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
   local bind = dik_to_bind(dik)
   local console = get_console()

   if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
      if dik == DIK_keys.DIK_ESCAPE then
         if level.present() and
            (   ((db.actor ~= nil)and(db.actor:alive())) or
               (false==IsGameTypeSingle())
            ) then
            self.OnButton_return_game()                      --' xStream 02.2008
            -- console:execute("main_menu off")                        --' xStream 02.2008
         end
      end

--------------------------TIME SCALE MOD----------------------------

      if (dik == DIK_keys.DIK_F1) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            --local current_time_factor = level.get_time_factor ()
            --console:execute("dbg:current_time_factor=" .. tostring(current_time_factor))
            level.set_time_factor (5)
            self.OnButton_return_game()
         end
      end
      
      if (dik == DIK_keys.DIK_F2) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_time_factor (60)      -- game default = 5
            --console:execute("dbg:time_factor_restored")
            self.OnButton_return_game()
         end
      end
      
      if (dik == DIK_keys.DIK_F3) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            --local current_time_factor = level.get_time_factor ()
            --console:execute("dbg:current_time_factor=" .. tostring(current_time_factor))
            level.set_time_factor (300)
            self.OnButton_return_game()
         end
      end

      if (dik == DIK_keys.DIK_F4) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            --local current_time_factor = level.get_time_factor ()
            --console:execute("dbg:current_time_factor=" .. tostring(current_time_factor))
            level.set_time_factor (1440)
            self.OnButton_return_game()
         end
      end

--------------------------TIME SKIP----------------------------
   
      if (dik == DIK_keys.DIK_LBRACKET) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_time_factor (1)
            local m=level.get_time_minutes()
            if m>0 then
               level.change_game_time(0, 22, 60-m);
            else
               level.change_game_time(0, 23, 0);
            end
            --level_weathers.get_weather_manager():forced_weather_change()
            self.OnButton_return_game()
         end
      end
      
      if (dik == DIK_keys.DIK_RBRACKET) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_time_factor (1)
            local m=level.get_time_minutes()
            if m>0 then
               level.change_game_time(0, 0, 60-m);
            else
               level.change_game_time(0, 1, 0);
            end
            --level_weathers.get_weather_manager():forced_weather_change()
            self.OnButton_return_game()
         end
      end
--------------------------Change weathers----------------------------
   
      if (dik == DIK_keys.DIK_Q) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_weather("default_clear",true)
            self.OnButton_return_game()
         end
      end
      
      if (dik == DIK_keys.DIK_W) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_weather("default_partly",true)
            self.OnButton_return_game()
         end
      end

      if (dik == DIK_keys.DIK_E) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_weather("default_foggy",true)
            self.OnButton_return_game()
         end
      end
   
      if (dik == DIK_keys.DIK_R) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_weather("default_veryfoggy",true)
            self.OnButton_return_game()
         end
      end
   
      if (dik == DIK_keys.DIK_T) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_weather("default_cloudy",true)
            self.OnButton_return_game()
         end
      end
   
      if (dik == DIK_keys.DIK_Y) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_weather("default_rain",true)
            self.OnButton_return_game()
         end
      end
   
      if (dik == DIK_keys.DIK_U) then
         if level.present() and ((db.actor ~= nil)and(db.actor:alive())) then
            level.set_weather("default_thunder",true)
            self.OnButton_return_game()
         end
      end
--------------------------Surge Start----------------------------
      if dik == DIK_keys.DIK_S then
            surge_manager.get_surge_manager():start(true)
         self.OnButton_return_game()
        end

--------------------------HUD DISABLE MOD----------------------------
      if dik == DIK_keys.DIK_H then
            level.hide_indicators_safe()
         self.OnButton_return_game()
        end

      if dik == DIK_keys.DIK_J then
            level.show_indicators()
         self.OnButton_return_game()
        end
---------------------------------------------------------------------


--      if dik == DIK_keys.DIK_S then
--         self:OnButton_load_spawn()

--      else
--      if dik == DIK_keys.DIK_Q then
--         self:OnMessageQuitWin()
--      end

   end

   return true
end


xr_conditions.script z Wladcy zony
:

Kod: Zaznacz wszystko
-- Ęŕćäŕ˙ ôóíęöč˙ â ýňîě ôŕéëĺ čńďîëüçóĺňń˙ ęŕę óńëîâčĺ xr_logic: {=ôóíęöč˙ !ôóíęöč˙}
-- Ĺńëč â ôóíęöčţ íĺîáőîäčěî ďĺđĺäŕâŕňü ďŕđŕěĺňđű, ňî:  {=ôóíęöč˙(ďŕđŕě1:ďŕđŕě2:...) !ôóíęöč˙(ďŕđŕě1:ďŕđŕě2:...)}
-- Ôîđěŕň: function f(actor, npc).  ńëó÷ŕĺ ďĺđĺäŕ÷č ďŕđŕěĺňđîâ: function f(actor, npc, p).
-- ----------------------------------------------------------------------------------------------------
-- Ôóíęöčč äë˙ đŕáîňű ń combat_ignore_cond
-- ----------------------------------------------------------------------------------------------------
function is_enemy_actor(enemy, object)
   return enemy:id() == db.actor:id()
end

-- ňĺęóůčé âđŕă íŕ đŕńńňî˙íčč áîëüřĺ čëč đŕâíîě çŕäŕííîěó đŕńńňî˙íčţ
-- äë˙ combat_ignore
function fighting_dist_ge(enemy, npc, p)
   local d = p[1]
   return enemy:position():distance_to_sqr(npc:position()) >= d * d
end

-- đŕńńňî˙íčĺ äî ňĺęóůĺăî đĺŕëüíîăî âđŕăŕ ěĺíüřĺ čëč đŕâíî çŕäŕííîăî çíŕ÷ĺíč˙
function fighting_dist_le(enemy, npc, p)
   local d = p[1]
   return enemy:position():distance_to_sqr(npc:position()) <= d * d
end

function enemy_in_zone(enemy, npc, p)
   local zone = db.zone_by_name[p[1]]
   if zone == nil then
      abort("Wrong zone name %s in enemy_in_zone function. NPC [%s]", tostring(p[1]), npc:name())
   end
   return utils.npc_in_zone(enemy, zone)
end


-- ----------------------------------------------------------------------------------------------------
-- Îáůčĺ ôóíęöčč
-- ----------------------------------------------------------------------------------------------------
-- âčäčě ëč ěű ĺůĺ "÷ĺđíűé ýęđŕí" čëč íĺň?
function black_screen(actor, npc)
   return device().precache_frame > 1
end
--Ďđîâĺđęŕ, âńňđĺ÷ŕĺňń˙ ëč â čěĺíč ÷óâŕęŕ îäíŕ čç ńňđîę .
function check_npc_name (actor , npc , p)
   if npc:name() == nil then return false end
   local name_exist = false
   for k,v in pairs(p) do
      if string.find( npc:name(), v ) ~= nil then
         name_exist = true
      end
   end
   return name_exist
end

function check_enemy_name (actor , npc , p)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   local name
   if enemy and enemy:alive() then
      name = enemy:name()
      for i, v in pairs(p) do
         if string.find( name, v ) ~= nil then
            return true
         end
      end
   end
   return false
end

function is_playing_sound (actor, npc)
   return xr_sound.sound_table[npc:id()] ~= nil
end

-- ďđîâĺđęŕ, ÷ňî ŕęňĺđ ćčâ
function actor_alive(actor, npc)
   if db.actor and db.actor:alive() then
      return true
   end
   return false
end

function see_npc(actor, npc, p)
   local npc1 = get_story_object(p[1])
   if npc and npc1 then
      --printf("cond <see_npc>: [%s]->[%s]", npc:name(), npc1:name())
      return npc:see(npc1)
   else
      return false
   end
end

function actor_see_npc(actor, npc)
   return db.actor:see(npc)
end

function npc_in_actor_frustum(actor, npc)
   return npc_in_actor_frustrum(npc)
end

function is_wounded(actor, npc)
   return xr_wounded.is_wounded(npc)
end

function dist_to_actor_le(actor, npc, p)
   local d = p[1]
   if d == nil then
      abort("Wrong parameter in 'dist_to_actor_le' function!!!")
   end
   return d and npc:position():distance_to_sqr(actor:position()) <= d * d
end

function dist_to_actor_ge(actor, npc, p)
   local d = p[1]
   if d == nil then
      abort("Wrong parameter in 'dist_to_actor_ge' function!!!")
   end
   return d and npc:position():distance_to_sqr(actor:position()) >= d * d
end

-- Ďđîâĺđęŕ âűďîëí˙ĺň ëč ęňî óęŕçŕííóţ đŕáîňó
function is_obj_on_job(actor, npc, p)
   local smart
   if p and p[2] then
      smart = sim_board.get_sim_board():get_smart_by_name(p[2])
   else
      smart = xr_gulag.get_npc_smart(npc)
   end
   if smart == nil then
      return false
   end
   for k,v in pairs(smart.npc_info) do
      local npc_job = smart.job_data[v.job_id]
      printf("section [%s]", tostring(npc_job.section))
      if npc_job.section == p[1] then
         return true
      end
   end
   return false
end

-- ďđîâĺđęŕ ňîăî ÷ňî äčńňŕíöč˙ äî îáüĺęňŕ <= çŕäŕííîé
-- ďŕđŕěĺňđű: [sid,dist]
function distance_to_obj_on_job_le(actor, npc, p)
   local smart = xr_gulag.get_npc_smart(npc)
   for k,v in pairs(smart.npc_info) do
      local npc_job = smart.job_data[v.job_id]
      if npc_job.section == p[1] then
         return npc:position():distance_to_sqr(v.se_obj.position) <= p[2]*p[2]
      end
   end
   return false
end

-- ďđîâĺđęŕ ňîăî ÷ňî npc íŕőîäčňń˙ â çŕäŕííîé çîíĺ
-- !!! ÂŰÇŰÂŔŇÜ ŇÎËÜĘÎ ČÇ SPACE RESTRICTOR !!!
-- ďŕđŕěĺňđű: [sid1:sid2:...]
-- !!! ÍĹĘÎĐĐĹĘŇÍÎ ĐŔÁÎŇŔĹŇ ÄËß ÎÁÜĹĘŇÎÂ Â offline'e !!!
-- !!! ÄËß ĂŔĐŔÍŇČČ ČŃĎÎËÜÇÎÂŔŇÜ one_obj_in_zone !!!
function obj_in_zone(actor, zone, p)
   local npc1, i, v = 0, 0, 0
   for i, v in pairs(p) do
      npc1 = get_story_object_id(v)
      if npc1 and zone:inside(alife():object(npc1).position) then
         return true
      end
   end
   return false
end

-- ďŕđŕěĺňđű: [sid:def*] def=true|false
-- * ďŕđŕěĺňđ íĺ îá˙çŕňĺëĺí
function one_obj_in_zone(actor, zone, p)
   --local def_offline = (p[2] ~= "false") -- default (true) result if npc in offline
   local obj1 = get_story_object_id(p[1])

   if obj1 then -- npc is online
      return zone:inside(alife():object(obj1).position)
   else -- npc is offline
      return (p[2] ~= "false") -- default (true) result if npc in offline
   end
end

function story_obj_in_zone_by_name (actor, npc, p)
   local obj = get_story_object_id(p[1])
   local zone = db.zone_by_name[p[2]]
   if obj and zone then -- npc is online
      return zone:inside(alife():object(obj).position)
   end
   return false
end

function actor_in_zone(actor, npc, p)
   local zone = db.zone_by_name[p[1]]
   return utils.npc_in_zone(db.actor, zone)
end

function npc_in_zone(actor, npc, p)
   local zone = db.zone_by_name[p[1]]

   if type(npc.id) ~= "function" then
      npc_obj = db.storage[npc.id] and db.storage[npc.id].object
      if zone == nil then
         return true
      end

      if npc_obj == nil then
         return zone:inside(npc.position)
      end
   else
      npc_obj = npc
   end

   return utils.npc_in_zone(npc_obj, zone)
end

-- true, ĺńëč çäîđîâüĺ npc <= çŕäŕííîěó çíŕ÷ĺíčţ
-- false â ďđîňčâíîě ńëó÷ŕĺ
function health_le(actor, npc, p)
   return p[1] and npc.health < p[1]
end

-- true, ĺńëč çäîđîâüĺ ŕęňĺđŕ  <= çŕäŕííîěó çíŕ÷ĺíčţ
-- false â ďđîňčâíîě ńëó÷ŕĺ
function actor_health_le(actor, npc, p)
   return p[1] and actor.health < p[1]
end

--[[
-- true, ĺńëč çäîđîâüĺ âĺđňîë¸ňŕ <= çŕäŕííîěó çíŕ÷ĺíčţ
-- false â ďđîňčâíîě ńëó÷ŕĺ
function heli_health_le(actor, obj, p)
   return p[1] and obj:get_helicopter():GetfHealth() < p[1]
end

-- âčäčň ëč âĺđňîë¸ň npc (ďî story id)
function heli_see_npc(actor, obj, p)
   if p[1] then
      local o = get_story_object( p[1] )
      return o ~= nil and obj:get_helicopter():isVisible( o )
   else
      return false
   end
end

function heli_see_actor(actor, obj)
   return actor ~= nil and obj:get_helicopter():isVisible( actor )
end

-- Ďđîâĺđęŕ íŕ ďđčíŕäëĺćíîńňü âđŕăŕ ę îäíîé čç ăđóďď
-- (ěîćíî çŕäŕâŕňü íĺńęîëüęî ÷ĺđĺç äâîĺňî÷čĺ)
function enemy_group(actor, npc, p)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   local g = enemy:group()
   local i, v = 0, 0
   for i, v in pairs(p) do
      if v == g then
         --printf("_bp: [%s]'s enemy is from group [%d]", npc:name(), v)
         return true
      end
   end
   return false
end

function gulag_state(actor, npc, p)
   if xr_gulag.getGulagState(p[1]) == p[2] then
      return true
   end
   return false
end
]]--

function npc_community(actor, npc, p)
   local npc_obj

   if p[1] == nil then
      abort("Wrong number of params in npc_community")
   end

   if type(npc.id) ~= "function" then
      npc_obj = db.storage[npc.id] and db.storage[npc.id].object

      if npc_obj == nil then return npc:community() == p[1] end
   else
      npc_obj = npc
   end

   if character_community(npc_obj) == p[1] then
      return true
   end
   return false
end

--[[
function npc_rank(actor, npc, p)
   if p[1] == nil then
      abort("Wrong number of params in npc_rank")
   end

   if ranks.get_obj_rank_name(npc) == p[1] then
      return true
   end
   return false
end

function npc_profile(actor, npc, p)
   if p[1] == nil then
      abort("Wrong number of params in npc_profile")
   end
   if npc:profile_name() == p[1] then
      return true
   end
   return false
end
]]--

-- Ďđîâĺđęŕ ňîăî ÷ňî óäŕđ áűë íŕíĺńĺí ęĺě-ňî čç npc óęŕçŕííűő â ńďčńęĺ.
-- Ďŕđŕěĺňđű ýňî story_id ďĺđńîíŕćĺé. Ěîćíî çŕäŕâŕňü íĺńęîëüęî story_id.
function hitted_by(actor, npc, p)
   local npc1
   local t = db.storage[npc:id()].hit
   if t then
      for i, v in pairs(p) do
         npc1 = get_story_object(v)
         if npc1 and t.who == npc1:id() then
            return true
         end
      end
   end
   return false
end
-- Ôóíęöč˙ ďđîâĺđęč ďîďŕäŕíč˙ â ęîńňü ďî ĺ¸ číäĺęńó.(Ďđîâĺđęŕ ňîëüęî äë˙ ńĺęöčč hit)
function hitted_on_bone(actor, npc, p)
   for k,v in pairs (p) do
      if db.storage[npc:id()].hit.bone_index == npc:get_bone_id(v) then
         return true
      end
   end
   return false
end

-- Ďđîâĺđęŕ, ÷ňî ëó÷řĺĺ îđóćčĺ ďĺđńîíŕćŕ - ďčńňîëĺň
function best_pistol(actor, npc)
   local pistol = npc:item_in_slot(1)
   if pistol ~= nil then
      return true
   else
      return false
   end
end

-- Ďđîâĺđęŕ, ÷ňî ďĺđńîíŕćó íŕíĺńëč ńěĺđňĺëüíűé őčň. Ďđîâĺđ˙ňü ŇÎËÜĘÎ íŕ on_hit
function deadly_hit(actor, npc)
   if db.storage[npc:id()] == nil or db.storage[npc:id()].hit == nil then
      --printf("deadly hit false")
      return false
   end

   --printf("deadly hit [%s]", tostring(db.storage[npc:id()].hit.deadly_hit == true))
   return db.storage[npc:id()].hit.deadly_hit == true
end



-- Ďđîâĺđęŕ ňîăî ÷ňî ďĺđńîíŕć áűë óáčň ęĺě-ňî čç npc óęŕçŕííűő â ńďčńęĺ.
-- Ďŕđŕěĺňđű ýňî story_id ďĺđńîíŕćĺé. Ěîćíî çŕäŕâŕňü íĺńęîëüęî story_id.
function killed_by(actor, npc, p)
   local npc1
   local t = db.storage[npc:id()].death
   if t then
      for i, v in pairs(p) do
         npc1 = get_story_object(v)
         if npc1 and t.killer == npc1:id() then
            printf("_bp: killed_by(%d)", v)
            return true
         end
      end
   end
   return false
end

-- ďđîâĺđęŕ (ďî story_id) âńĺ ëč ďđîâĺđ˙ĺěűĺ ńňŕëęĺđű ćčâű
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_alive_all(actor, npc, p)
   local npc1
   for i, v in pairs(p) do
      npc1 = get_story_object_id(v)
      if npc1 == nil then
         return false
      end
      npc1 = alife():object(npc1)
      if npc1 and (not IsStalker(npc1) or not npc1:alive()) then
         return false
      end
   end
   return true
end

-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî ÷îň˙ áű îäčí čç ďđîâĺđ˙ĺěűő ńňŕëęĺđîâ ćčâ
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_alive_one(actor, npc, p)
   local npc1
   for i, v in pairs(p) do
      npc1 = get_story_object_id(v)
      if npc1 == nil then
         return false
      end
      npc1 = alife():object(npc1)
      if npc1 and IsStalker(npc1) and npc1:alive() then
         return true
      end
   end
   return false
end

-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî ďđîâĺđ˙ĺěűq npc ćčâ
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_alive(actor, npc, p)
   local npc1

   if npc == nil or (p and p[1]) then
      npc1 = get_story_object_id(p[1])
   elseif (type(npc.id) == "number") then
      npc1 = npc.id
   else
      npc1 = npc:id()
   end

   if npc1 == nil then
      return false
   end

   npc1 = alife():object(npc1)

   if npc1 and IsStalker(npc1) and npc1:alive() then
      return true
   end

   return false
end

-- ďđîâĺđęŕ (ďî story_id) âńĺ ëč ďđîâĺđ˙ĺěűĺ ńňŕëęĺđű ěĺđňâű
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_dead_all(actor, npc, p)
   local npc1
   for i, v in pairs(p) do
      npc1 = get_story_object(v)
      if npc1 then
         if npc1:alive() then
            return false
         else
            printf("_bp: is_dead_all(%d) = true", v)
            return true
         end
      end
      return false
   end
   return true
end

-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî őîň˙ áű îäčí čç ďđîâĺđ˙ĺěűő ńňŕëęĺđîâ ěĺđňâ
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_dead_one(actor, npc, p)
   local npc1
   for i, v in pairs(p) do
      npc1 = get_story_object(v)
      if not npc1 or not npc1:alive() then
         printf("_bp: is_dead_one(%d) = true", v)
         return true
      end
   end
   return false
end

-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî őîň˙ áű îäčí čç ďđîâĺđ˙ĺěűő ńňŕëęĺđîâ ěĺđňâ
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_dead(actor, npc, p)
   local npc1
   npc1 = get_story_object(p[1])
   return not npc1 or not npc1:alive()
end

-- Ďđîâĺđ˙ĺň , ńóůĺńňâóĺň ëč îáüĺęň ń çŕäŕííűě ńňîđč ŕéäč.
function story_object_exist(actor, npc, p)
   local npc1 = get_story_object(p[1])
   return npc1 ~= nil
end

--[[
-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî íŕřčě âđŕăîě ĺńňü őîň˙ áű ęîňî-ňî îäčí čç ńďčńęŕ
function check_fighting(actor, npc, p)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   local sid
   if enemy and enemy:alive() then
         sid = enemy:story_id()
         for i, v in pairs(p) do
               --printf("_bp: %s.check_fighting(%d)", npc:name(), v)
            if type(v) == 'number' and sid == v then
               --printf("TRUE")
               return true
            end
         end
   end
   --printf("_bp: check_fighting() = false")
   return false
end
]]--


-- true, ĺńëč ó ŕęň¸đŕ â číâĺíňŕđĺ ĺńňü óęŕçŕííűé ďđĺäěĺň
-- false, ĺńëč íĺňó, ëčáî íĺ çŕäŕíŕ ńĺęöč˙ ďđĺäěĺňŕ
function actor_has_item(actor, npc, p)
   local story_actor  = get_story_object("actor")
   return p[1] ~= nil and story_actor and story_actor:object( p[1] ) ~= nil
end

function npc_has_item(actor, npc, p)
   return p[1] ~= nil and npc:object( p[1] ) ~= nil
end
-- ďđîâĺđ˙ĺň íŕëč÷čĺ çŕäŕíîăî ęîëč÷ĺńňâŕ ďđĺäěĺňîâ â číâĺíňŕđĺ čăđîęŕ.
function actor_has_item_count(actor, npc, p)
   local item_section    = p[1]
   local need_count    = tonumber(p[2])
   local has_count    = 0
   local function calc(temp, item)
      --printf("item [%s]",tostring(item:section()))
      if item:section() == item_section then
         has_count = has_count + 1
      end
   end
   actor:iterate_inventory(calc, actor)
   return has_count >= need_count
end

-- âîçâđŕůŕĺň true, ĺńëč â ňĺęóůĺé ńőĺěĺ ďĺđńîíŕćŕ âçâĺä¸í óęŕçŕííűé ńčăíŕë.
function signal(actor, npc, p)
   if p[1] then
      local st   = db.storage[npc:id()]
      local sigs = st[st.active_scheme].signals
--      printf( "xr_conditions.signal: npc=%s, scheme=%s", npc:name(), tostring(st.active_scheme) )
      return sigs ~= nil and sigs[p[1]] == true
   else
      return false
   end
end

-- âîçâđŕůŕĺň true, ĺńëč çíŕ÷ĺíčĺ óęŕçŕííîăî ń÷¸ň÷čęŕ ŕęň¸đŕ áîëüřĺ óęŕçŕííîăî ÷čńëŕ
function counter_greater(actor, npc, p)
   if p[1] and p[2] then
      local c = xr_logic.pstor_retrieve(actor, p[1], 0)
--      if  c > p[2] then printf("pl: counter [%s]  greater [%s]", p[1], p[2]) end
      return c > p[2]
   else
      return false
   end
end
function counter_equal(actor, npc, p)
   if p[1] and p[2] then
      local c = xr_logic.pstor_retrieve(actor, p[1], 0)
      return c == p[2]
   else
      return false
   end
end

--[[
-- îďđĺäĺë˙ĺň íĺ÷¸ňíîńňü číňĺđâŕëŕ čăđîâîăî âđĺěĺíč. číňĺđâŕë íóćíî ďĺđĺäŕňü â p[1]
function odd_time_interval(actor, npc, p)
   return odd( game.time() / p[1] )
end
]]--
-------------------------------------------------------------------------------------------------------
-- Ôóíęöčč ďîääĺđćęč kamp
function _kamp_talk(actor, npc)
   if xr_kamp.kamp_stalkers[npc:id()] then
      return xr_kamp.kamp_stalkers[npc:id()]
   end
   return false
end

function _used(actor, npc)
   return npc:is_talking()
end
-------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------
local alarm_statuses = {
   normal = smart_terrain_control.NORMAL,
   danger = smart_terrain_control.DANGER,
   alarm = smart_terrain_control.ALARM
}

-- Ôóíęöčč ďîääĺđćęč áĺçîďŕńíîńňč áŕç
function check_smart_alarm_status(actor, npc, p)
   local smart_name = p[1]
   local status = alarm_statuses[p[2]]

   if status == nil then
      abort("Wrong status[%s] in 'check_smart_alarm_status'", tostring(p[2]))
   end

   local smart = sim_board.get_sim_board():get_smart_by_name(smart_name)

   local smart_control = smart.base_on_actor_control

   if smart_control == nil then
      abort("Cannot calculate 'check_smart_alarm_status' for smart %s", tostring(smart_name))
   end

   return smart_control:get_status() == status
end

-------------------------------------------------------------------------------------------------------
function has_enemy(actor, npc)
   return npc:best_enemy() ~= nil
end

function has_actor_enemy(actor, npc)
   local best_enemy = npc:best_enemy()
   return best_enemy ~= nil and best_enemy:id() == db.actor:id()
end

function see_enemy(actor, npc)
   local enemy = npc:best_enemy()

   if enemy ~= nil then
         return npc:see(enemy)
   end
   return false
end

function has_enemy_in_current_loopholes_fov(actor, npc)
   return npc:in_smart_cover() and npc:best_enemy() ~= nil and npc:in_current_loophole_fov( npc:best_enemy():position())
end

function talking(actor, npc)
   return actor:is_talking()
end

function npc_talking(actor, npc)
   return npc:is_talking()
end

function see_actor(actor, npc)
   return npc:alive() and npc:see(actor)
end

function actor_enemy(actor, npc)
   local t = db.storage[npc:id()].death
   return npc:relation(actor) == game_object.enemy or (t ~= nil and t.killer == actor:id())
end

function actor_friend(actor, npc)
   return npc:relation(actor) == game_object.friend
end

function actor_neutral(actor, npc)
   return npc:relation(actor) == game_object.neutral
end

function is_factions_enemies(actor, npc, p)
   if(p[1]~=nil) then
      return game_relations.is_factions_enemies(character_community(actor), p[1])
   else
      return false
   end
end

function is_factions_neutrals(actor, npc, p)
   return not(is_factions_enemies(actor, npc, p) or is_factions_friends(actor, npc, p))
end

function is_factions_friends(actor, npc, p)
   if(p[1]~=nil) then
      return game_relations.is_factions_friends(character_community(actor), p[1])
   else
      return false
   end
end

function is_faction_enemy_to_actor(actor, npc, p)
   if(p[1]~=nil) then
--        return db.actor:community_goodwill(p[1])<-1000
      return relation_registry.community_goodwill(p[1], db.actor:id())<=-1000
   else
      return false
   end
end

function is_faction_friend_to_actor(actor, npc, p)
   if(p[1]~=nil) then
--      return db.actor:community_goodwill(p[1])>1000
      return relation_registry.community_goodwill(p[1], db.actor:id())>=1000
   else
      return false
   end
end

function is_faction_neutral_to_actor(actor, npc, p)
   return not(is_faction_enemy_to_actor(actor, npc, p) or is_faction_friend_to_actor(actor, npc, p))
end

function is_squad_friend_to_actor(actor, npc, p)
   if(p[1]~=nil) then
--      printf("squad check goodwill1 [%s]", p[1])
      return game_relations.check_all_squad_members(p[1], "friend")
   else
--      printf("squad check goodwill5 [%s]", p[1])
      return false
   end
end

function is_squad_enemy_to_actor(actor, npc, p)
   if not p then
      abort("Not enough arguments in 'is_squad_enemy_to_actor' funciton!")
   end

   for k,v in pairs(p) do
--      printf("squad check goodwill1 [%s]", v)
      if game_relations.check_all_squad_members(v, "enemy") then
         return true
      end
   end

   return false
end

function is_squad_neutral_to_actor(actor, npc, p)
   return not(is_squad_enemy_to_actor(actor, npc, p) or is_squad_friend_to_actor(actor, npc, p))
end

-- ňĺęóůčé âđŕă ŕęň¸đ?
function fighting_actor(actor, npc)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   return enemy and enemy:id() == actor:id()
end


function hit_by_actor(actor, npc)
   local t = db.storage[npc:id()].hit
   local hit_by_actor = (t ~= nil and t.who == actor:id())
   printf("_bp: hit_by_actor: %s", if_then_else(hit_by_actor, "true", "false"))
   return hit_by_actor
end

function killed_by_actor(actor, npc)
   local t = db.storage[npc:id()].death
   local killed_by_actor = t ~= nil and t.killer == actor:id()
   printf("_bp: killed_by_actor: %s", if_then_else(killed_by_actor, "true", "false"))
   return killed_by_actor
end

function actor_has_weapon (actor, npc)
   local obj = actor:active_item ()
   if obj == nil or isWeapon (obj) == false then return false end
   return true
end

function actor_active_detector(actor, npc, p)
   local detector_section = p and p[1]
   if detector_section == nil then abort("Wrong parameters in function 'actor_active_detector'") end
   local actor_detector = db.actor:active_detector()
   return (actor_detector ~= nil) and actor_detector:section() == detector_section
end

function heavy_wounded(actor, npc)
   return xr_wounded.is_heavy_wounded_by_id( npc:id() )
end

--[[
Ďđîâĺđęŕ íŕ çŕäŕííűé ďĺđčîä âđĺěĺíč
Âđĺě˙ çŕäŕĺňń˙ â ěčíóňŕő
Ďŕđŕěĺňđű: (time_shift:period_min)
                time_shift - ďĺđčîäč÷íîńňü ńđŕáŕňűâŕíč˙
                period - ďĺđčîä ńđŕáŕňűâŕíč˙ íŕ ęîňîđîě ěű ďîëó÷ŕĺě true

Ďđčěĺđű:
time_period(60:10) - âîçâđŕůŕĺň true ęŕćäűé ÷ŕń íŕ ďđîň˙ćĺíčč ďĺđâűő 10 ěčíóň
--]]
function time_period(actor, npc, p)
   local tshift, period = p[1], p[2]
   if tshift ~= nil and period ~= nil and db.actor ~= nil then
      return tshift > period and level.get_time_minutes() % tshift <= period
   end
   return false
end

function is_rain (actor, npc)
   return db.actor ~= nil and level.rain_factor() > 0
end

function is_heavy_rain (actor, npc)
   return db.actor ~= nil and level.rain_factor() >= 0.5
end

function is_day (actor, npc)
   return db.actor ~= nil and level.get_time_hours() >= 6 and level.get_time_hours() < 21
end

function is_dark_night (actor, npc)
   return db.actor ~= nil and (level.get_time_hours() < 3 or level.get_time_hours() > 22)
end

function is_jup_a12_mercs_time (actor, npc)
   return db.actor ~= nil and (level.get_time_hours() >= 1 and level.get_time_hours() < 5)
end

function zat_b7_is_night (actor, npc)
   return db.actor ~= nil and (level.get_time_hours() >= 23 or level.get_time_hours() < 5)
end

function zat_b7_is_late_attack_time (actor, npc)
   return db.actor ~= nil and (level.get_time_hours() >= 23 or level.get_time_hours() < 9)
end

function mob_has_enemy(actor, npc)
   -- return false
   if npc == nil then return false end
   --if npc:get_enemy () then printf ("ENEMY PRESENT") else printf ("ENEMY NOT PRESENT") end
   return npc:get_enemy() ~= nil
end

function mob_was_hit(actor, npc)
   local h = npc:get_monster_hit_info()
   if h.who and h.time ~= 0 then
      return true
   end
   return false
end

function actor_on_level(actor, npc, p)
   for k,v in pairs (p) do
      --printf("level name: [%s], needed level name: [%s]", level.name(), v`)
      if v == level.name() then
         return true
      end
   end
   return false
end

function treasure_exist(actor, npc, p)
   --printf("%s %s", actor:name(), npc:name())
   return true
end

--[[
--'-----------------------------------------------------------------------------------
--' Cover support
--'-----------------------------------------------------------------------------------
--' Ĺńëč âîçâđŕůŕĺň true, ňî ńîëäŕňű çŕ ęŕâĺđŕěč íŕ÷číŕţň ńňđĺë˙ňü.
function cover_attack(actor, npc)
   --' Áĺđĺě ńęâŕä îáúĺęňŕ
   local squad = get_object_squad(npc)

   if squad == nil then
      return false
   end

   return squad:cover_attack()
end
]]--

--'-----------------------------------------------------------------------------------
--' Squad support
--'-----------------------------------------------------------------------------------
function squad_in_zone(actor, npc, p)
   local story_id = p[1]
   local zone_name = p[2]
   if story_id == nil then
      abort("Insufficient params in squad_in_zone function. story_id[%s], zone_name[%s]", tostring(story_id), tostring(zone_name))
   end
   if zone_name == nil then
      zone_name = npc:name()
   end

   local sim_board = sim_board.get_sim_board()

   local squad = get_story_squad(story_id)
   if squad == nil then
      --abort("There is no squad with id[%s]", tostring(squad_id))
      return false
   end

   local zone = db.zone_by_name[zone_name]
   if zone == nil then
      --abort("There is no squad with id[%s]", tostring(zone_name))
      return false
   end

   for k in squad:squad_members() do
      local position = (db.storage[k.id] and db.storage[k.id].object and db.storage[k.id].object:position()) or k.object.position
      if zone:inside(position) then
         return true
      end
   end
   return false
end

function squad_has_enemy(actor, npc, p)
   local story_id = p[1]

   if story_id == nil then
      abort("Insufficient params in squad_has_enemy function. story_id [%s]", tostring(story_id))
   end

   local squad = get_story_squad(story_id)
   if squad == nil then
      --abort("There is no squad with id[%s]", tostring(story_id))
      return false
   end

   local al = alife()
   for k in squad:squad_members() do
      local npc_obj = level.object_by_id(k.object.id)
      if npc_obj == nil then
         return false
      end
      if npc_obj:best_enemy() ~= nil then
         return true
      end
   end

   return false
end

-- Functions for Yantar
function squad_in_zone_all(actor, npc, p)
   local story_id = p[1]
   local zone_name = p[2]
   if story_id == nil or zone_name == nil then
      abort("Insufficient params in squad_in_zone_all function. story_id[%s], zone_name[%s]", tostring(story_id), tostring(zone_name))
   end
   local squad = get_story_squad(story_id)
   if squad == nil then
      --abort("There is no squad with id[%s]", tostring(story_id))
      return false
   end
   local zone = db.zone_by_name[zone_name]
   if zone == nil then
      --abort("There is no squad with id[%s]", tostring(zone_name))
      return false
   end
   local al = alife()
   for k in squad:squad_members() do
      local position = (db.storage[k.id] and db.storage[k.id].object and db.storage[k.id].object:position()) or k.object.position
      if not zone:inside(position) then
         return false
      end
   end
   return true
end

function squads_in_zone_b41(actor, npc, p)
   local smart = sim_board.get_sim_board():get_smart_by_name("jup_b41")
   local zone = db.zone_by_name["jup_b41_sr_light"]
   local al = alife()

   if zone == nil then
      return false
   end
   if smart == nil then
      return false
   end

   for k,v in pairs(sim_board.get_sim_board().smarts[smart.id].squads) do
      if v ~= nil then
         for j in v:squad_members() do
            if not zone:inside(j.object.position) then
               return false
            end
         end
      end
   end

   return true
end


--' Ďđîâĺđęŕ â ňŕđăĺň ęîíäëčńňĺ çŕäŕíč˙, ńîîňâĺňńňâóĺň ëč čě˙ ńęâŕäŕ ďĺđĺäŕííîěó
function target_squad_name(actor, obj, p)
   if p[1] == nil then
      abort("Wrong parameters")
   end
   if not(obj) then
      return false
   end
   --callstack()
   if IsStalker(obj) or IsMonster(obj) then
      if alife():object(obj.group_id) == nil then
         return false
      end
      if string.find( alife():object(obj.group_id):section_name(), p[1] ) ~= nil then
         return true
      end
      --return alife():object(obj.group_id):section_name() == p[1]
   end
   return obj:section_name() == p[1]
end

--' Ďđîâĺđęŕ â ňŕđăĺň ęîíäëčńňĺ çŕäŕíč˙, ńîîňâĺňńňâóĺň ëč čě˙ ńěŕđňŕ ďĺđĺäŕííîěó
function target_smart_name(actor, smart, p)
   if p[1] == nil then
      abort("Wrong parameters")
   end
   --callstack()
   return smart:name() == p[1]
end

--' Ďđîâĺđ˙ĺň ćčâ ëč îňđ˙ä ń óęŕçŕííűě ID
function squad_exist(actor, npc, p)
   local story_id = p[1]
   if story_id == nil then
      abort("Wrong parameter story_id[%s] in squad_exist function", tostring(story_id))
   end
   local squad = get_story_squad(story_id)

--   if squad == nil then
--      return false
--   end
   return squad ~= nil
   --   return squad.squad_power > 0
end

function is_squad_commander(actor, npc)  -- Ďîâĺëčňĺëü Çîíű --
   if (type(npc.id) == "number") then
      npc_id = npc.id
   else
      npc_id = npc:id()
   end



      local squad = get_object_squad(npc)
 
      if squad==nil then return true end

      return squad ~= nil and squad:commander_id() == npc_id
end

function squad_npc_count_ge(actor, npc, p)
   local story_id = p[1]
   if story_id == nil then
      abort("Wrong parameter squad_id[%s] in 'squad_npc_count_ge' function", tostring(squad_id))
   end
   local squad = get_story_squad(story_id)

   if squad then
      return squad:npc_count() > tonumber(p[2])
   else
      return false
   end
end

function surge_complete()
   return surge_manager.is_finished()
end

function surge_started()
   return surge_manager.is_started()
end

function surge_kill_all()
   return surge_manager.is_killing_all()
end

function signal_rocket_flying(actor, npc, p)
   if p==nil then
      abort("Signal rocket name is not set!")
   end
   if db.signal_light[p[1]] then
      return db.signal_light[p[1]]:is_flying()
   else
      abort("No such signal rocket: [%s] on level", tostring(p[1]))
   end
   return false
end

function quest_npc_enemy_actor(actor, npc, p)
   if p[1] == nil then
      abort("wrong story id")
   else
      local obj = get_story_object(p[1])
      if obj and IsStalker(obj) then
         if db.actor and obj:general_goodwill(db.actor)<=-1000 then
            return true
         end
      end
   end
   return false
end

function animpoint_reached(actor, npc)
   local animpoint_storage = db.storage[npc:id()].animpoint

   if animpoint_storage == nil then
      return false
   end

   local animpoint_class = animpoint_storage.animpoint

   return animpoint_class:position_riched()
end

--[[
function npc_stay_offline(actor, npc, p)
   if p == nil then
      abort("Wrong parameter!!!")
   end
   if npc and db.actor then
      if is_smart_in_combat(actor, npc, p) then
         if npc.position:distance_to(db.actor:position())>=30 or game_relations.get_gulag_relation_actor(p[1], "enemy") then
            return true
         end
      end
   end
   return false
end
]]--

-- ďđîâĺđęŕ ňîăî ÷ňî äčńňŕíöč˙ äî îáüĺęňŕ >= çŕäŕííîé
-- ďŕđŕěĺňđű: [sid,dist]
function distance_to_obj_ge(actor, npc, p)
   local npc_id = get_story_object_id(p[1])
   local npc1 = npc_id and alife():object(npc_id)
   if npc1 then
      return db.actor:position():distance_to_sqr(npc1.position) >= p[2]*p[2]
   end
   return false
end

function distance_to_obj_le(actor, npc, p)
   local npc_id = get_story_object_id(p[1])
   local npc1 = npc_id and alife():object(npc_id)
   if npc1 then
      return db.actor:position():distance_to_sqr(npc1.position) < p[2]*p[2]
   end
   return false
end

function in_dest_smart_cover(actor, npc, p)
   return npc:in_smart_cover()
end

function active_item(actor, npc, p)
   if p and p[1] then
      for k,v  in pairs(p) do
         if actor:item_in_slot(3) ~= nil and actor:item_in_slot(3):section() == v then return true end
      end
   end
   return false
end

function actor_nomove_nowpn()
   if (not isWeapon(db.actor:active_item())) or db.actor:is_talking() then
      return true
   end
   return false
end

function jup_b16_is_zone_active(actor, npc)
   return has_alife_info(npc:name())
end

--Ôóíęöč˙ ďđîâĺđęč ńîńňî˙íč˙ âčäčěîńňč ęđîâîńîńŕ.
-- Âîçěîćíűé íŕáîđ ďŕđŕěĺňđîâ --> story_id:visibility_state(ěîćíî âűçűâŕňü îňęóäŕ óăîäíî) čëč visibility_state(ĺńëč âűçűâŕĺňń˙ čç ęŕńňîěäŕňű ęđîâîńîńŕ)
--  visibility_state -->
--                  0 - íĺâčäčěűé
--                  1 - ďîëóâčäčěűé
--                  2 - ďîëíîńňüţ âčäčěűé

function check_bloodsucker_state(actor, npc, p)
   if (p and p[1]) == nil then abort("Wrong parameters in function 'check_bloodsucker_state'!!!") end
   local state = p[1]
   if p[2] ~= nil then
      state = p[2]
      npc = get_story_object(p[1])
   end
   if npc ~= nil then
      return npc:get_visibility_state () == tonumber(state)
   end
   return false
end

function dist_to_story_obj_ge(actor, npc, p)
   local story_id = p and p[1]
   local story_obj_id = get_story_object_id(story_id)
   if story_obj_id == nil then return true end
   local se_obj = alife():object(story_obj_id)
   return se_obj.position:distance_to(db.actor:position()) > p[2]
end

function actor_has_nimble_weapon(actor, npc)
   local need_item = {}
   need_item["wpn_groza_nimble"] = true
   need_item["wpn_desert_eagle_nimble"] = true
   need_item["wpn_fn2000_nimble"] = true
   need_item["wpn_g36_nimble"] = true
   need_item["wpn_protecta_nimble"] = true
   need_item["wpn_mp5_nimble"] = true
   need_item["wpn_sig220_nimble"] = true
   need_item["wpn_spas12_nimble"] = true
   need_item["wpn_usp_nimble"] = true
   need_item["wpn_vintorez_nimble"] = true
   need_item["wpn_svu_nimble"] = true
   need_item["wpn_svd_nimble"] = true
   for k,v in pairs(need_item) do
      if actor:object(k) ~= nil then
         return true
      end
   end
   return false
end

function actor_has_active_nimble_weapon(actor, npc)
   local need_item = {}
   need_item["wpn_groza_nimble"] = true
   need_item["wpn_desert_eagle_nimble"] = true
   need_item["wpn_fn2000_nimble"] = true
   need_item["wpn_g36_nimble"] = true
   need_item["wpn_protecta_nimble"] = true
   need_item["wpn_mp5_nimble"] = true
   need_item["wpn_sig220_nimble"] = true
   need_item["wpn_spas12_nimble"] = true
   need_item["wpn_usp_nimble"] = true
   need_item["wpn_vintorez_nimble"] = true
   need_item["wpn_svu_nimble"] = true
   need_item["wpn_svd_nimble"] = true

   if actor:item_in_slot(2) ~= nil and need_item[actor:item_in_slot(2):section()] == true then
      return true
   end
   if actor:item_in_slot(3) ~= nil and need_item[actor:item_in_slot(3):section()] == true then
      return true
   end
   return false
end

function jup_b202_inventory_box_empty(actor, npc)
   local inv_box = get_story_object("jup_b202_actor_treasure")
   return inv_box:is_inv_box_empty()
end
--[[
function jup_b46_actor_has_active_science_detector(actor, npc)
   if actor:item_in_slot(9) ~= nil and actor:item_in_slot(9):section() == "detector_scientific" then return true end
   return false
end
]]--
function is_in_danger(actor, npc, p)
   if p and p[1] then
      npc = get_story_object(p[1])
   end
   --printf("npc: [%s] is in danger [%s]", tostring(npc:id()), tostring(db.storage[npc:id()].danger_flag))
   return db.storage[npc:id()].danger_flag
end

function object_exist(actor , npc , p)
   return get_story_object(p[1]) ~= nil
end

function squad_curr_action(actor, npc, p)
   local squad = get_object_squad(npc)
   return squad.current_action and squad.current_action.name == p[1]
end

function is_monster_snork(actor, npc)
   return npc:clsid() == clsid.snork_s
end

function is_monster_dog(actor, npc)
   return npc:clsid() == clsid.dog_s
end

function is_monster_psy_dog(actor, npc)
   return npc:clsid() == clsid.psy_dog_s
end

function is_monster_polter(actor, npc)
   return npc:clsid() == clsid.poltergeist_s
end

function is_monster_tushkano(actor, npc)
   return npc:clsid() == clsid.tushkano_s
end

function is_monster_burer(actor, npc)
   return npc:clsid() == clsid.burer_s
end

function is_monster_controller(actor, npc)
   return npc:clsid() == clsid.controller_s
end

function is_monster_flesh(actor, npc)
   return npc:clsid() == clsid.flesh_s
end

function is_monster_boar(actor, npc)
   return npc:clsid() == clsid.boar_s
end


function dead_body_searching(actor, npc)
   return actor_menu.dead_body_searching
end

function jup_b47_npc_online(actor, npc, p)
--   printf("function jup_b47_npc_online: story_obj[%s]", tostring(p[1]))
   local story_obj = get_story_object(p[1])
   if story_obj == nil then
      return false
   end
   local obj = alife():object(story_obj:id())
   return obj ~= nil
end

function anomaly_has_artefact(actor, npc, p)
   local az_name = p and p[1]
   local af_name = p and p[2]

   local anomal_zone = db.anomaly_by_name[az_name]
   if anomal_zone == nil then
      return false
   end

   if anomal_zone.spawned_count < 1 then
      return false
   end

   if af_name == nil then
      local af_table = {}
      for k,v in pairs(anomal_zone.artefact_ways_by_id) do
         if alife():object(tonumber(k)) then
            table.insert(af_table, alife():object(tonumber(k)):section_name())
         end
      end
      return true, af_table
   end

   for k,v in pairs(anomal_zone.artefact_ways_by_id) do
      if alife():object(tonumber(k)) and af_name == alife():object(tonumber(k)):section_name() then
         return true
      end
   end

   return false
end

function zat_b29_anomaly_has_af(actor, npc, p)
   local az_name = p and p[1]
   local af_name

   local anomal_zone = db.anomaly_by_name[az_name]
   if anomal_zone == nil then
      return false
   end

   if anomal_zone.spawned_count < 1 then
      return false
   end

   for i = 16, 23 do
      if has_alife_info(dialogs_zaton.zat_b29_infop_bring_table[i]) then
         af_name = dialogs_zaton.zat_b29_af_table[i]
         break
      end
   end

   for k,v in pairs(anomal_zone.artefact_ways_by_id) do
      if alife():object(tonumber(k)) and af_name == alife():object(tonumber(k)):section_name() then
         db.actor:give_info_portion(az_name)
         return true
      end
   end

   return false
end

function jup_b221_who_will_start(actor, npc, p) -- äîńňóďíűĺ ďŕđŕěĺňđű: ability - ďđîâĺđčňü ĺńňü ëč äîńňóďíűĺ ňĺěű, choose - âűáđŕňü ăđóďčđîâęó ęîňîđŕ˙ íŕ÷íĺň ďĺđĺďŕëęó
   local reachable_theme = {}
   local faction_table = {}
   local info_table = {
---------duty
      [1] = "jup_b25_freedom_flint_gone",
      [2] = "jup_b25_flint_blame_done_to_duty",
      [3] = "jup_b4_monolith_squad_in_duty",
      [4] = "jup_a6_duty_leader_bunker_guards_work",
      [5] = "jup_a6_duty_leader_employ_work",
      [6] = "jup_b207_duty_wins",
---------freedom
      [7] = "jup_b207_freedom_know_about_depot",
      [8] = "jup_b46_duty_founder_pda_to_freedom",
      [9] = "jup_b4_monolith_squad_in_freedom",
      [10] = "jup_a6_freedom_leader_bunker_guards_work",
      [11] = "jup_a6_freedom_leader_employ_work",
      [12] = "jup_b207_freedom_wins"
   }
--Ńîńňŕâë˙ĺě ňŕáëčöó äîńňűďíűő ňĺě(ňëüęî íîěĺđŕ ňĺě).
   for k,v in pairs(info_table) do
      if k <= 6 then
         faction_table[1] = "duty"
         faction_table[2] = "0"
      else
         faction_table[1] = "freedom"
         faction_table[2] = "6"
      end
      if (has_alife_info(v)) and (not has_alife_info("jup_b221_" .. faction_table[1] .. "_main_" .. tostring(k - tonumber(faction_table[2])) .. "_played")) then
         table.insert(reachable_theme,k)
         printf("jup_b221_who_will_start: table reachable_theme ------------------------------> [%s]", tostring(k))
      end
   end
   if (p and p[1]) == nil then
      abort("No such parameters in function 'jup_b221_who_will_start'")
   end
   if tostring(p[1]) == "ability" then
      return #reachable_theme ~= 0 -- ĺńëč ňŕáëčöŕ ďóńňŕ çíŕ÷čň íĺň äîńňóďíűő ňĺě č íĺíŕäî čăđŕňü ńöĺíó
   elseif  tostring(p[1]) == "choose" then
---------Âűáĺđĺě đŕíäîěŕě ĺëĺěĺíň ńîńňŕâëĺíîé ňŕáëčöű č ďđîâĺđčě ę ęŕęîé ăđóďĺđîâęč îí ďđĺíŕäëĺćčň :)
      return reachable_theme[math.random(1, #reachable_theme)] <= 6 -- ĺńëč ěĺíüřĺ 6-ňč çíŕ÷čň ÄÎËĂ ĺńëč áîëüřĺ 6-ňč çíŕ÷čň ŃÂÎÁÎÄŔ
   else
      abort("Wrong parameters in function 'jup_b221_who_will_start'")
   end
end

function pas_b400_actor_far_forward(actor, npc)
   local fwd_obj = get_story_object("pas_b400_fwd")

   if fwd_obj then
      if distance_between(fwd_obj, db.actor) > distance_between(fwd_obj, npc) then
         return false
      end
   else
      return false
   end

   local distance = 70 * 70
   local self_dist = npc:position():distance_to_sqr(actor:position())
   if self_dist < distance then
      return false
   end

   local squad = alife():object(alife():object(npc:id()).group_id)

   for k in squad:squad_members() do
      local other_dist = k.object.position:distance_to_sqr(actor:position())
      if other_dist < distance then
         return false
      end
   end

   --printf("npc: [%s], actor is far forward - self_dist [%s] distance [%s]", tostring(npc:name()), self_dist, distance)

   return true
end

function pas_b400_actor_far_backward(actor, npc)
   local bwd_obj = get_story_object("pas_b400_bwd")

   if bwd_obj then
      if distance_between(bwd_obj, db.actor) > distance_between(bwd_obj, npc) then
         return false
      end
   else
      return false
   end

   local distance = 70 * 70
   local self_dist = npc:position():distance_to_sqr(actor:position())
   if self_dist < distance then
      return false
   end

   local squad = alife():object(alife():object(npc:id()).group_id)

   for k in squad:squad_members() do
      local other_dist = k.object.position:distance_to_sqr(actor:position())
      if other_dist < distance then
         return false
      end
   end

   --printf("npc: [%s], actor is far backward - self_dist [%s] distance [%s]", tostring(npc:name()), self_dist, distance)

   return true
end

function pri_a28_actor_is_far(actor, npc)
   local distance = 150 * 150
   local squad = get_story_squad("pri_a16_military_squad")

   for k in squad:squad_members() do
      local npc_dist = k.object.position:distance_to_sqr(actor:position())
      if npc_dist < distance then
         return false
      end
   end

   return true
end

function check_enemy_smart(actor , npc , p)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   if enemy == nil or enemy_id == alife():actor().id then
      return false
   end
   local enemy_smart = xr_gulag.get_npc_smart(enemy)

   if (enemy_smart ~= nil) and (enemy_smart:name() == p[1]) then
      return true
   end
   return false
end

function zat_b103_actor_has_needed_food(actor, npc, p)
   return (dialogs_zaton.zat_b103_actor_has_needed_food(actor, npc)) or (has_alife_info("zat_b103_merc_task_done"))
end

function zat_b29_rivals_dialog_precond(actor, npc)
   local squads_table = {
                  "zat_b29_stalker_rival_default_1_squad",
                  "zat_b29_stalker_rival_default_2_squad",
                  "zat_b29_stalker_rival_1_squad",
                  "zat_b29_stalker_rival_2_squad"
                  }

   local zones_table = {
                  "zat_b29_sr_1",
                  "zat_b29_sr_2",
                  "zat_b29_sr_3",
                  "zat_b29_sr_4",
                  "zat_b29_sr_5",
                  }

   local f_squad = false

   for k,v in pairs(squads_table) do
      if alife():object(alife():object(npc:id()).group_id):section_name() == v then
         f_squad = true
         break
      end
   end

   if not f_squad then
      return false
   end

   for k,v in pairs(zones_table) do
      if utils.npc_in_zone(npc, db.zone_by_name[v]) then
         return true
      end
   end

   return false
end

function polter_ignore_actor(actor, npc)
   return npc:poltergeist_get_actor_ignore()
end

function burer_gravi_attack(actor, npc)
   return npc:burer_get_force_gravi_attack()
end

function burer_anti_aim(actor, npc)
   return npc:burer_get_force_anti_aim()
end

function jup_b202_actor_treasure_not_in_steal(actor, npc)
   local before = ((not has_alife_info("jup_b52_actor_items_can_be_stolen")) and (not has_alife_info("jup_b202_actor_items_returned")))
   local after  = (has_alife_info("jup_b52_actor_items_can_be_stolen") and has_alife_info("jup_b202_actor_items_returned"))
   return (before or after)
end

function jup_b25_senya_spawn_condition(actor, npc)
   return (has_alife_info("jup_b16_oasis_found") or has_alife_info("zat_b57_bloodsucker_lair_clear") or has_alife_info("jup_b6_complete_end") or has_alife_info("zat_b215_gave_maps")) and has_alife_info("zat_b106_search_soroka")
end

function jup_b25_flint_gone_condition(actor, npc)
   return has_alife_info("jup_b25_flint_blame_done_to_duty") or has_alife_info("jup_b25_flint_blame_done_to_freedom") or has_alife_info("zat_b106_found_soroka_done")
end

-------------------------------------------------------------------------------------------------------------------------------------------
--   STALKER TRADE FUNCTIONS
-------------------------------------------------------------------------------------------------------------------------------------------
function has_tradable_stuff(actor, npc)


end


-------------------------------------------------------------------------------------------------------------------------------------------
--   end of STALKER TRADE FUNCTIONS
-------------------------------------------------------------------------------------------------------------------------------------------


pioneer_functor = xr_statistic.pioneer_functor

mutant_hunter_functor = xr_statistic.mutant_hunter_functor

detective_functor = xr_statistic.detective_functor

one_of_the_lads_functor = xr_statistic.one_of_the_lads_functor

kingpin_functor = xr_statistic.kingpin_functor

herald_of_justice_functor = xr_statistic.herald_of_justice_functor

seeker_functor = xr_statistic.seeker_functor

battle_systems_master_functor = xr_statistic.battle_systems_master_functor

high_tech_master_functor = xr_statistic.high_tech_master_functor

skilled_stalker_functor = xr_statistic.skilled_stalker_functor

leader_functor = xr_statistic.leader_functor

diplomat_functor = xr_statistic.diplomat_functor

research_man_functor = xr_statistic.research_man_functor

friend_of_duty_functor = xr_statistic.friend_of_duty_functor

friend_of_freedom_functor = xr_statistic.friend_of_freedom_functor

balance_advocate_functor = xr_statistic.balance_advocate_functor

wealthy_functor = xr_statistic.wealthy_functor

keeper_of_secrets_functor = xr_statistic.keeper_of_secrets_functor

marked_by_zone_functor = xr_statistic.marked_by_zone_functor

information_dealer_functor = xr_statistic.information_dealer_functor

friend_of_stalkers_functor = xr_statistic.friend_of_stalkers_functor


--------------------------------------------------------------------------------
function check_deimos_phase(actor, npc, p)
   if(p[1] and p[2]) then
      local obj = db.storage[npc:id()]
      local delta = sr_deimos.check_intensity_delta(obj)
            if(p[2]=="increasing" and delta) then
                  return false
            elseif(p[2]=="decreasing" and not(delta)) then
                  return false
            end
      if(p[1]=="disable_bound") then
         if(p[2]=="increasing") then
                        if not(sr_deimos.check_disable_bound(obj)) then
               return true
            end
         elseif(p[2]=="decreasing") then
                        return sr_deimos.check_disable_bound(obj)
         end
      elseif(p[1]=="lower_bound") then
         if(p[2]=="increasing") then
                        if not(sr_deimos.check_lower_bound(obj)) then
               return true
            end
         elseif(p[2]=="decreasing") then
                        return sr_deimos.check_lower_bound(obj)
         end
      elseif(p[1]=="upper_bound") then
         if(p[2]=="increasing") then
                        if not(sr_deimos.check_upper_bound(obj)) then
               return true
            end
         elseif(p[2]=="decreasing") then
                        return sr_deimos.check_upper_bound(obj)
         end
      end
   end
end

--------------------------------------------------------------------------------

function actor_in_surge_cover(actor, npc, p)
   return surge_manager.actor_in_cover()
end

function is_door_blocked_by_npc(actor, obj)
   return obj:is_door_blocked_by_npc()
end

function has_active_tutorial()
   return game.has_active_tutorial()
end

function upgrade_hint_kardan(actor, npc, p)
   local hint_table = {}
   local can_upgrade = 0
   local tools = (p and tonumber(p[1])) or 0

   if not has_alife_info("zat_b3_all_instruments_brought") then
      if not has_alife_info("zat_b3_tech_instrument_1_brought") and (tools == 0 or tools == 1) then
         table.insert(hint_table, "st_upgr_toolkit_1")
      elseif tools == 1 then
         can_upgrade = can_upgrade + 1
      end
      if not has_alife_info("zat_b3_tech_instrument_2_brought") and (tools == 0 or tools == 2) then
         table.insert(hint_table, "st_upgr_toolkit_2")
      elseif tools == 2 then
         can_upgrade = can_upgrade + 1
      end
      if not has_alife_info("zat_b3_tech_instrument_3_brought") and (tools == 0 or tools == 3) then
         table.insert(hint_table, "st_upgr_toolkit_3")
      elseif tools == 3 then
         can_upgrade = can_upgrade + 1
      end
   else
      can_upgrade = can_upgrade + 1
   end

   if not has_alife_info("zat_b3_tech_see_produce_62") then
      if (tools == 1) and not has_alife_info("zat_b3_tech_have_one_dose") then
         table.insert(hint_table, "st_upgr_vodka")
      elseif (tools ~= 1) and (not has_alife_info("zat_b3_tech_have_couple_dose")) then
         table.insert(hint_table, "st_upgr_vodka")
      else
         can_upgrade = can_upgrade + 1
      end
   else
      can_upgrade = can_upgrade + 1
   end

   inventory_upgrades.cur_hint = hint_table

   return can_upgrade >= 2
end


xr_conditions.script z [AtmosFear] Cromm Cruac
:

Kod: Zaznacz wszystko
-- Ęŕćäŕ˙ ôóíęöč˙ â ýňîě ôŕéëĺ čńďîëüçóĺňń˙ ęŕę óńëîâčĺ xr_logic: {=ôóíęöč˙ !ôóíęöč˙}
-- Ĺńëč â ôóíęöčţ íĺîáőîäčěî ďĺđĺäŕâŕňü ďŕđŕěĺňđű, ňî:  {=ôóíęöč˙(ďŕđŕě1:ďŕđŕě2:...) !ôóíęöč˙(ďŕđŕě1:ďŕđŕě2:...)}
-- Ôîđěŕň: function f(actor, npc).  ńëó÷ŕĺ ďĺđĺäŕ÷č ďŕđŕěĺňđîâ: function f(actor, npc, p).
-- ----------------------------------------------------------------------------------------------------
-- Ôóíęöčč äë˙ đŕáîňű ń combat_ignore_cond
-- ----------------------------------------------------------------------------------------------------
function is_enemy_actor(enemy, object)
   return enemy:id() == db.actor:id()
end

-- ňĺęóůčé âđŕă íŕ đŕńńňî˙íčč áîëüřĺ čëč đŕâíîě çŕäŕííîěó đŕńńňî˙íčţ
-- äë˙ combat_ignore
function fighting_dist_ge(enemy, npc, p)
   local d = p[1]
   return enemy:position():distance_to_sqr(npc:position()) >= d * d
end

-- đŕńńňî˙íčĺ äî ňĺęóůĺăî đĺŕëüíîăî âđŕăŕ ěĺíüřĺ čëč đŕâíî çŕäŕííîăî çíŕ÷ĺíč˙
function fighting_dist_le(enemy, npc, p)
   local d = p[1]
   return enemy:position():distance_to_sqr(npc:position()) <= d * d
end

function enemy_in_zone(enemy, npc, p)
   local zone = db.zone_by_name[p[1]]
   if zone == nil then
      abort("Wrong zone name %s in enemy_in_zone function. NPC [%s]", tostring(p[1]), npc:name())
   end
   return utils.npc_in_zone(enemy, zone)
end


-- ----------------------------------------------------------------------------------------------------
-- Îáůčĺ ôóíęöčč
-- ----------------------------------------------------------------------------------------------------
-- âčäčě ëč ěű ĺůĺ "÷ĺđíűé ýęđŕí" čëč íĺň?
function black_screen(actor, npc)
   return device().precache_frame > 1
end
--Ďđîâĺđęŕ, âńňđĺ÷ŕĺňń˙ ëč â čěĺíč ÷óâŕęŕ îäíŕ čç ńňđîę .
function check_npc_name (actor , npc , p)
   if npc:name() == nil then return false end
   local name_exist = false
   for k,v in pairs(p) do
      if string.find( npc:name(), v ) ~= nil then
         name_exist = true
      end
   end
   return name_exist
end

function check_enemy_name (actor , npc , p)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   local name
   if enemy and enemy:alive() then
      name = enemy:name()
      for i, v in pairs(p) do
         if string.find( name, v ) ~= nil then
            return true
         end
      end
   end
   return false
end

function is_playing_sound (actor, npc)
   return xr_sound.sound_table[npc:id()] ~= nil
end

-- ďđîâĺđęŕ, ÷ňî ŕęňĺđ ćčâ
function actor_alive(actor, npc)
   if db.actor and db.actor:alive() then
      return true
   end
   return false
end

function see_npc(actor, npc, p)
   local npc1 = get_story_object(p[1])
   if npc and npc1 then
      --printf("cond <see_npc>: [%s]->[%s]", npc:name(), npc1:name())
      return npc:see(npc1)
   else
      return false
   end
end

function actor_see_npc(actor, npc)
   return db.actor:see(npc)
end

function npc_in_actor_frustum(actor, npc)
   return npc_in_actor_frustrum(npc)
end

function is_wounded(actor, npc)
   return xr_wounded.is_wounded(npc)
end

function dist_to_actor_le(actor, npc, p)
   local d = p[1]
   if d == nil then
      abort("Wrong parameter in 'dist_to_actor_le' function!!!")
   end
   return d and npc:position():distance_to_sqr(actor:position()) <= d * d
end

function dist_to_actor_ge(actor, npc, p)
   local d = p[1]
   if d == nil then
      abort("Wrong parameter in 'dist_to_actor_ge' function!!!")
   end
   return d and npc:position():distance_to_sqr(actor:position()) >= d * d
end

-- Ďđîâĺđęŕ âűďîëí˙ĺň ëč ęňî óęŕçŕííóţ đŕáîňó
function is_obj_on_job(actor, npc, p)
   local smart
   if p and p[2] then
      smart = sim_board.get_sim_board():get_smart_by_name(p[2])
   else
      smart = xr_gulag.get_npc_smart(npc)
   end
   if smart == nil then
      return false
   end
   for k,v in pairs(smart.npc_info) do
      local npc_job = smart.job_data[v.job_id]
      printf("section [%s]", tostring(npc_job.section))
      if npc_job.section == p[1] then
         return true
      end
   end
   return false
end

-- ďđîâĺđęŕ ňîăî ÷ňî äčńňŕíöč˙ äî îáüĺęňŕ <= çŕäŕííîé
-- ďŕđŕěĺňđű: [sid,dist]
function distance_to_obj_on_job_le(actor, npc, p)
   local smart = xr_gulag.get_npc_smart(npc)
   for k,v in pairs(smart.npc_info) do
      local npc_job = smart.job_data[v.job_id]
      if npc_job.section == p[1] then
         return npc:position():distance_to_sqr(v.se_obj.position) <= p[2]*p[2]
      end
   end
   return false
end

-- ďđîâĺđęŕ ňîăî ÷ňî npc íŕőîäčňń˙ â çŕäŕííîé çîíĺ
-- !!! ÂŰÇŰÂŔŇÜ ŇÎËÜĘÎ ČÇ SPACE RESTRICTOR !!!
-- ďŕđŕěĺňđű: [sid1:sid2:...]
-- !!! ÍĹĘÎĐĐĹĘŇÍÎ ĐŔÁÎŇŔĹŇ ÄËß ÎÁÜĹĘŇÎÂ Â offline'e !!!
-- !!! ÄËß ĂŔĐŔÍŇČČ ČŃĎÎËÜÇÎÂŔŇÜ one_obj_in_zone !!!
function obj_in_zone(actor, zone, p)
   local npc1, i, v = 0, 0, 0
   for i, v in pairs(p) do
      npc1 = get_story_object_id(v)
      if npc1 and zone:inside(alife():object(npc1).position) then
         return true
      end
   end
   return false
end

-- ďŕđŕěĺňđű: [sid:def*] def=true|false
-- * ďŕđŕěĺňđ íĺ îá˙çŕňĺëĺí
function one_obj_in_zone(actor, zone, p)
   --local def_offline = (p[2] ~= "false") -- default (true) result if npc in offline
   local obj1 = get_story_object_id(p[1])

   if obj1 then -- npc is online
      return zone:inside(alife():object(obj1).position)
   else -- npc is offline
      return (p[2] ~= "false") -- default (true) result if npc in offline
   end
end

function story_obj_in_zone_by_name (actor, npc, p)
   local obj = get_story_object_id(p[1])
   local zone = db.zone_by_name[p[2]]
   if obj and zone then -- npc is online
      return zone:inside(alife():object(obj).position)
   end
   return false
end

function actor_in_zone(actor, npc, p)
   local zone = db.zone_by_name[p[1]]
   return utils.npc_in_zone(db.actor, zone)
end

function npc_in_zone(actor, npc, p)
   local zone = db.zone_by_name[p[1]]

   if type(npc.id) ~= "function" then
      npc_obj = db.storage[npc.id] and db.storage[npc.id].object
      if zone == nil then
         return true
      end

      if npc_obj == nil then
         return zone:inside(npc.position)
      end
   else
      npc_obj = npc
   end

   return utils.npc_in_zone(npc_obj, zone)
end

-- true, ĺńëč çäîđîâüĺ npc <= çŕäŕííîěó çíŕ÷ĺíčţ
-- false â ďđîňčâíîě ńëó÷ŕĺ
function health_le(actor, npc, p)
   return p[1] and npc.health < p[1]
end

-- true, ĺńëč çäîđîâüĺ ŕęňĺđŕ  <= çŕäŕííîěó çíŕ÷ĺíčţ
-- false â ďđîňčâíîě ńëó÷ŕĺ
function actor_health_le(actor, npc, p)
   return p[1] and actor.health < p[1]
end

--[[
-- true, ĺńëč çäîđîâüĺ âĺđňîë¸ňŕ <= çŕäŕííîěó çíŕ÷ĺíčţ
-- false â ďđîňčâíîě ńëó÷ŕĺ
function heli_health_le(actor, obj, p)
   return p[1] and obj:get_helicopter():GetfHealth() < p[1]
end

-- âčäčň ëč âĺđňîë¸ň npc (ďî story id)
function heli_see_npc(actor, obj, p)
   if p[1] then
      local o = get_story_object( p[1] )
      return o ~= nil and obj:get_helicopter():isVisible( o )
   else
      return false
   end
end

function heli_see_actor(actor, obj)
   return actor ~= nil and obj:get_helicopter():isVisible( actor )
end

-- Ďđîâĺđęŕ íŕ ďđčíŕäëĺćíîńňü âđŕăŕ ę îäíîé čç ăđóďď
-- (ěîćíî çŕäŕâŕňü íĺńęîëüęî ÷ĺđĺç äâîĺňî÷čĺ)
function enemy_group(actor, npc, p)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   local g = enemy:group()
   local i, v = 0, 0
   for i, v in pairs(p) do
      if v == g then
         --printf("_bp: [%s]'s enemy is from group [%d]", npc:name(), v)
         return true
      end
   end
   return false
end

function gulag_state(actor, npc, p)
   if xr_gulag.getGulagState(p[1]) == p[2] then
      return true
   end
   return false
end
]]--

function npc_community(actor, npc, p)
   local npc_obj

   if p[1] == nil then
      abort("Wrong number of params in npc_community")
   end

   if type(npc.id) ~= "function" then
      npc_obj = db.storage[npc.id] and db.storage[npc.id].object

      if npc_obj == nil then return npc:community() == p[1] end
   else
      npc_obj = npc
   end

   if character_community(npc_obj) == p[1] then
      return true
   end
   return false
end

--[[
function npc_rank(actor, npc, p)
   if p[1] == nil then
      abort("Wrong number of params in npc_rank")
   end

   if ranks.get_obj_rank_name(npc) == p[1] then
      return true
   end
   return false
end

function npc_profile(actor, npc, p)
   if p[1] == nil then
      abort("Wrong number of params in npc_profile")
   end
   if npc:profile_name() == p[1] then
      return true
   end
   return false
end
]]--

-- Ďđîâĺđęŕ ňîăî ÷ňî óäŕđ áűë íŕíĺńĺí ęĺě-ňî čç npc óęŕçŕííűő â ńďčńęĺ.
-- Ďŕđŕěĺňđű ýňî story_id ďĺđńîíŕćĺé. Ěîćíî çŕäŕâŕňü íĺńęîëüęî story_id.
function hitted_by(actor, npc, p)
   local npc1
   local t = db.storage[npc:id()].hit
   if t then
      for i, v in pairs(p) do
         npc1 = get_story_object(v)
         if npc1 and t.who == npc1:id() then
            return true
         end
      end
   end
   return false
end
-- Ôóíęöč˙ ďđîâĺđęč ďîďŕäŕíč˙ â ęîńňü ďî ĺ¸ číäĺęńó.(Ďđîâĺđęŕ ňîëüęî äë˙ ńĺęöčč hit)
function hitted_on_bone(actor, npc, p)
   for k,v in pairs (p) do
      if db.storage[npc:id()].hit.bone_index == npc:get_bone_id(v) then
         return true
      end
   end
   return false
end

-- Ďđîâĺđęŕ, ÷ňî ëó÷řĺĺ îđóćčĺ ďĺđńîíŕćŕ - ďčńňîëĺň
function best_pistol(actor, npc)
   local pistol = npc:item_in_slot(1)
   if pistol ~= nil then
      return true
   else
      return false
   end
end

-- Ďđîâĺđęŕ, ÷ňî ďĺđńîíŕćó íŕíĺńëč ńěĺđňĺëüíűé őčň. Ďđîâĺđ˙ňü ŇÎËÜĘÎ íŕ on_hit
function deadly_hit(actor, npc)
   if db.storage[npc:id()] == nil or db.storage[npc:id()].hit == nil then
      --printf("deadly hit false")
      return false
   end

   --printf("deadly hit [%s]", tostring(db.storage[npc:id()].hit.deadly_hit == true))
   return db.storage[npc:id()].hit.deadly_hit == true
end



-- Ďđîâĺđęŕ ňîăî ÷ňî ďĺđńîíŕć áűë óáčň ęĺě-ňî čç npc óęŕçŕííűő â ńďčńęĺ.
-- Ďŕđŕěĺňđű ýňî story_id ďĺđńîíŕćĺé. Ěîćíî çŕäŕâŕňü íĺńęîëüęî story_id.
function killed_by(actor, npc, p)
   local npc1
   local t = db.storage[npc:id()].death
   if t then
      for i, v in pairs(p) do
         npc1 = get_story_object(v)
         if npc1 and t.killer == npc1:id() then
            printf("_bp: killed_by(%d)", v)
            return true
         end
      end
   end
   return false
end

-- ďđîâĺđęŕ (ďî story_id) âńĺ ëč ďđîâĺđ˙ĺěűĺ ńňŕëęĺđű ćčâű
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_alive_all(actor, npc, p)
   local npc1
   for i, v in pairs(p) do
      npc1 = get_story_object_id(v)
      if npc1 == nil then
         return false
      end
      npc1 = alife():object(npc1)
      if npc1 and (not IsStalker(npc1) or not npc1:alive()) then
         return false
      end
   end
   return true
end

-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî ÷îň˙ áű îäčí čç ďđîâĺđ˙ĺěűő ńňŕëęĺđîâ ćčâ
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_alive_one(actor, npc, p)
   local npc1
   for i, v in pairs(p) do
      npc1 = get_story_object_id(v)
      if npc1 == nil then
         return false
      end
      npc1 = alife():object(npc1)
      if npc1 and IsStalker(npc1) and npc1:alive() then
         return true
      end
   end
   return false
end

-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî ďđîâĺđ˙ĺěűq npc ćčâ
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_alive(actor, npc, p)
   local npc1

   if npc == nil or (p and p[1]) then
      npc1 = get_story_object_id(p[1])
   elseif (type(npc.id) == "number") then
      npc1 = npc.id
   else
      npc1 = npc:id()
   end

   if npc1 == nil then
      return false
   end

   npc1 = alife():object(npc1)

   if npc1 and IsStalker(npc1) and npc1:alive() then
      return true
   end

   return false
end

-- ďđîâĺđęŕ (ďî story_id) âńĺ ëč ďđîâĺđ˙ĺěűĺ ńňŕëęĺđű ěĺđňâű
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_dead_all(actor, npc, p)
   local npc1
   for i, v in pairs(p) do
      npc1 = get_story_object(v)
      if npc1 then
         if npc1:alive() then
            return false
         else
            printf("_bp: is_dead_all(%d) = true", v)
            return true
         end
      end
      return false
   end
   return true
end

-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî őîň˙ áű îäčí čç ďđîâĺđ˙ĺěűő ńňŕëęĺđîâ ěĺđňâ
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_dead_one(actor, npc, p)
   local npc1
   for i, v in pairs(p) do
      npc1 = get_story_object(v)
      if not npc1 or not npc1:alive() then
         printf("_bp: is_dead_one(%d) = true", v)
         return true
      end
   end
   return false
end

-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî őîň˙ áű îäčí čç ďđîâĺđ˙ĺěűő ńňŕëęĺđîâ ěĺđňâ
-- TODO: čńďđŕâčňü ńčňóŕöčţ, ęîăäŕ âűäŕĺňń˙ íĺďđŕâčëüíűé đĺçóëüňŕň äë˙ îáüĺęňîâ, ęîňîđűĺ
--       íĺ óńďĺëč ďđîńďŕâíčňüń˙.
function is_dead(actor, npc, p)
   local npc1
   npc1 = get_story_object(p[1])
   return not npc1 or not npc1:alive()
end

-- Ďđîâĺđ˙ĺň , ńóůĺńňâóĺň ëč îáüĺęň ń çŕäŕííűě ńňîđč ŕéäč.
function story_object_exist(actor, npc, p)
   local npc1 = get_story_object(p[1])
   return npc1 ~= nil
end

--[[
-- ďđîâĺđęŕ (ďî story_id) ňîăî, ÷ňî íŕřčě âđŕăîě ĺńňü őîň˙ áű ęîňî-ňî îäčí čç ńďčńęŕ
function check_fighting(actor, npc, p)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   local sid
   if enemy and enemy:alive() then
         sid = enemy:story_id()
         for i, v in pairs(p) do
               --printf("_bp: %s.check_fighting(%d)", npc:name(), v)
            if type(v) == 'number' and sid == v then
               --printf("TRUE")
               return true
            end
         end
   end
   --printf("_bp: check_fighting() = false")
   return false
end
]]--


-- true, ĺńëč ó ŕęň¸đŕ â číâĺíňŕđĺ ĺńňü óęŕçŕííűé ďđĺäěĺň
-- false, ĺńëč íĺňó, ëčáî íĺ çŕäŕíŕ ńĺęöč˙ ďđĺäěĺňŕ
function actor_has_item(actor, npc, p)
   local story_actor  = get_story_object("actor")
   return p[1] ~= nil and story_actor and story_actor:object( p[1] ) ~= nil
end

function npc_has_item(actor, npc, p)
   return p[1] ~= nil and npc:object( p[1] ) ~= nil
end
-- ďđîâĺđ˙ĺň íŕëč÷čĺ çŕäŕíîăî ęîëč÷ĺńňâŕ ďđĺäěĺňîâ â číâĺíňŕđĺ čăđîęŕ.
function actor_has_item_count(actor, npc, p)
   local item_section    = p[1]
   local need_count    = tonumber(p[2])
   local has_count    = 0
   local function calc(temp, item)
      --printf("item [%s]",tostring(item:section()))
      if item:section() == item_section then
         has_count = has_count + 1
      end
   end
   actor:iterate_inventory(calc, actor)
   return has_count >= need_count
end

-- âîçâđŕůŕĺň true, ĺńëč â ňĺęóůĺé ńőĺěĺ ďĺđńîíŕćŕ âçâĺä¸í óęŕçŕííűé ńčăíŕë.
function signal(actor, npc, p)
   if p[1] then
      local st   = db.storage[npc:id()]
      local sigs = st[st.active_scheme].signals
--      printf( "xr_conditions.signal: npc=%s, scheme=%s", npc:name(), tostring(st.active_scheme) )
      return sigs ~= nil and sigs[p[1]] == true
   else
      return false
   end
end

-- âîçâđŕůŕĺň true, ĺńëč çíŕ÷ĺíčĺ óęŕçŕííîăî ń÷¸ň÷čęŕ ŕęň¸đŕ áîëüřĺ óęŕçŕííîăî ÷čńëŕ
function counter_greater(actor, npc, p)
   if p[1] and p[2] then
      local c = xr_logic.pstor_retrieve(actor, p[1], 0)
--      if  c > p[2] then printf("pl: counter [%s]  greater [%s]", p[1], p[2]) end
      return c > p[2]
   else
      return false
   end
end
function counter_equal(actor, npc, p)
   if p[1] and p[2] then
      local c = xr_logic.pstor_retrieve(actor, p[1], 0)
      return c == p[2]
   else
      return false
   end
end

--[[
-- îďđĺäĺë˙ĺň íĺ÷¸ňíîńňü číňĺđâŕëŕ čăđîâîăî âđĺěĺíč. číňĺđâŕë íóćíî ďĺđĺäŕňü â p[1]
function odd_time_interval(actor, npc, p)
   return odd( game.time() / p[1] )
end
]]--
-------------------------------------------------------------------------------------------------------
-- Ôóíęöčč ďîääĺđćęč kamp
function _kamp_talk(actor, npc)
   if xr_kamp.kamp_stalkers[npc:id()] then
      return xr_kamp.kamp_stalkers[npc:id()]
   end
   return false
end

function _used(actor, npc)
   return npc:is_talking()
end
-------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------
local alarm_statuses = {
   normal = smart_terrain_control.NORMAL,
   danger = smart_terrain_control.DANGER,
   alarm = smart_terrain_control.ALARM
}

-- Ôóíęöčč ďîääĺđćęč áĺçîďŕńíîńňč áŕç
function check_smart_alarm_status(actor, npc, p)
   local smart_name = p[1]
   local status = alarm_statuses[p[2]]

   if status == nil then
      abort("Wrong status[%s] in 'check_smart_alarm_status'", tostring(p[2]))
   end

   local smart = sim_board.get_sim_board():get_smart_by_name(smart_name)

   local smart_control = smart.base_on_actor_control

   if smart_control == nil then
      abort("Cannot calculate 'check_smart_alarm_status' for smart %s", tostring(smart_name))
   end

   return smart_control:get_status() == status
end

-------------------------------------------------------------------------------------------------------
function has_enemy(actor, npc)
   return npc:best_enemy() ~= nil
end

function has_actor_enemy(actor, npc)
   local best_enemy = npc:best_enemy()
   return best_enemy ~= nil and best_enemy:id() == db.actor:id()
end

function see_enemy(actor, npc)
   local enemy = npc:best_enemy()

   if enemy ~= nil then
         return npc:see(enemy)
   end
   return false
end

function has_enemy_in_current_loopholes_fov(actor, npc)
   return npc:in_smart_cover() and npc:best_enemy() ~= nil and npc:in_current_loophole_fov( npc:best_enemy():position())
end

function talking(actor, npc)
   return actor:is_talking()
end

function npc_talking(actor, npc)
   return npc:is_talking()
end

function see_actor(actor, npc)
   return npc:alive() and npc:see(actor)
end

function actor_enemy(actor, npc)
   local t = db.storage[npc:id()].death
   return npc:relation(actor) == game_object.enemy or (t ~= nil and t.killer == actor:id())
end

function actor_friend(actor, npc)
   return npc:relation(actor) == game_object.friend
end

function actor_neutral(actor, npc)
   return npc:relation(actor) == game_object.neutral
end

function is_factions_enemies(actor, npc, p)
   if(p[1]~=nil) then
      return game_relations.is_factions_enemies(character_community(actor), p[1])
   else
      return false
   end
end

function is_factions_neutrals(actor, npc, p)
   return not(is_factions_enemies(actor, npc, p) or is_factions_friends(actor, npc, p))
end

function is_factions_friends(actor, npc, p)
   if(p[1]~=nil) then
      return game_relations.is_factions_friends(character_community(actor), p[1])
   else
      return false
   end
end

function is_faction_enemy_to_actor(actor, npc, p)
   if(p[1]~=nil) then
--        return db.actor:community_goodwill(p[1])<-1000
      return relation_registry.community_goodwill(p[1], db.actor:id())<=-1000
   else
      return false
   end
end

function is_faction_friend_to_actor(actor, npc, p)
   if(p[1]~=nil) then
--      return db.actor:community_goodwill(p[1])>1000
      return relation_registry.community_goodwill(p[1], db.actor:id())>=1000
   else
      return false
   end
end

function is_faction_neutral_to_actor(actor, npc, p)
   return not(is_faction_enemy_to_actor(actor, npc, p) or is_faction_friend_to_actor(actor, npc, p))
end

function is_squad_friend_to_actor(actor, npc, p)
   if(p[1]~=nil) then
--      printf("squad check goodwill1 [%s]", p[1])
      return game_relations.check_all_squad_members(p[1], "friend")
   else
--      printf("squad check goodwill5 [%s]", p[1])
      return false
   end
end

function is_squad_enemy_to_actor(actor, npc, p)
   if not p then
      abort("Not enough arguments in 'is_squad_enemy_to_actor' funciton!")
   end

   for k,v in pairs(p) do
--      printf("squad check goodwill1 [%s]", v)
      if game_relations.check_all_squad_members(v, "enemy") then
         return true
      end
   end

   return false
end

function is_squad_neutral_to_actor(actor, npc, p)
   return not(is_squad_enemy_to_actor(actor, npc, p) or is_squad_friend_to_actor(actor, npc, p))
end

-- ňĺęóůčé âđŕă ŕęň¸đ?
function fighting_actor(actor, npc)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   return enemy and enemy:id() == actor:id()
end


function hit_by_actor(actor, npc)
   local t = db.storage[npc:id()].hit
   local hit_by_actor = (t ~= nil and t.who == actor:id())
   printf("_bp: hit_by_actor: %s", if_then_else(hit_by_actor, "true", "false"))
   return hit_by_actor
end

function killed_by_actor(actor, npc)
   local t = db.storage[npc:id()].death
   local killed_by_actor = t ~= nil and t.killer == actor:id()
   printf("_bp: killed_by_actor: %s", if_then_else(killed_by_actor, "true", "false"))
   return killed_by_actor
end

function actor_has_weapon (actor, npc)
   local obj = actor:active_item ()
   if obj == nil or isWeapon (obj) == false then return false end
   return true
end

function actor_active_detector(actor, npc, p)
   local detector_section = p and p[1]
   if detector_section == nil then abort("Wrong parameters in function 'actor_active_detector'") end
   local actor_detector = db.actor:active_detector()
   return (actor_detector ~= nil) and actor_detector:section() == detector_section
end

function heavy_wounded(actor, npc)
   return xr_wounded.is_heavy_wounded_by_id( npc:id() )
end

--[[
Ďđîâĺđęŕ íŕ çŕäŕííűé ďĺđčîä âđĺěĺíč
Âđĺě˙ çŕäŕĺňń˙ â ěčíóňŕő
Ďŕđŕěĺňđű: (time_shift:period_min)
                time_shift - ďĺđčîäč÷íîńňü ńđŕáŕňűâŕíč˙
                period - ďĺđčîä ńđŕáŕňűâŕíč˙ íŕ ęîňîđîě ěű ďîëó÷ŕĺě true

Ďđčěĺđű:
time_period(60:10) - âîçâđŕůŕĺň true ęŕćäűé ÷ŕń íŕ ďđîň˙ćĺíčč ďĺđâűő 10 ěčíóň
--]]
function time_period(actor, npc, p)
   local tshift, period = p[1], p[2]
   if tshift ~= nil and period ~= nil and db.actor ~= nil then
      return tshift > period and level.get_time_minutes() % tshift <= period
   end
   return false
end

function is_rain (actor, npc)
   return db.actor ~= nil and level.rain_factor() > 0
end

function is_heavy_rain (actor, npc)
   return db.actor ~= nil and level.rain_factor() >= 0.5
end

function is_day (actor, npc)
   return db.actor ~= nil and level.get_time_hours() >= 6 and level.get_time_hours() < 21
end

function is_dark_night (actor, npc)
   return db.actor ~= nil and (level.get_time_hours() < 3 or level.get_time_hours() > 22)
end

function is_jup_a12_mercs_time (actor, npc)
   return db.actor ~= nil and (level.get_time_hours() >= 1 and level.get_time_hours() < 5)
end

function zat_b7_is_night (actor, npc)
   return db.actor ~= nil and (level.get_time_hours() >= 23 or level.get_time_hours() < 5)
end

function zat_b7_is_late_attack_time (actor, npc)
   return db.actor ~= nil and (level.get_time_hours() >= 23 or level.get_time_hours() < 9)
end

function mob_has_enemy(actor, npc)
   -- return false
   if npc == nil then return false end
   --if npc:get_enemy () then printf ("ENEMY PRESENT") else printf ("ENEMY NOT PRESENT") end
   return npc:get_enemy() ~= nil
end

function mob_was_hit(actor, npc)
   local h = npc:get_monster_hit_info()
   if h.who and h.time ~= 0 then
      return true
   end
   return false
end

function actor_on_level(actor, npc, p)
   for k,v in pairs (p) do
      --printf("level name: [%s], needed level name: [%s]", level.name(), v`)
      if v == level.name() then
         return true
      end
   end
   return false
end

function treasure_exist(actor, npc, p)
   --printf("%s %s", actor:name(), npc:name())
   return true
end

--[[
--'-----------------------------------------------------------------------------------
--' Cover support
--'-----------------------------------------------------------------------------------
--' Ĺńëč âîçâđŕůŕĺň true, ňî ńîëäŕňű çŕ ęŕâĺđŕěč íŕ÷číŕţň ńňđĺë˙ňü.
function cover_attack(actor, npc)
   --' Áĺđĺě ńęâŕä îáúĺęňŕ
   local squad = get_object_squad(npc)

   if squad == nil then
      return false
   end

   return squad:cover_attack()
end
]]--

--'-----------------------------------------------------------------------------------
--' Squad support
--'-----------------------------------------------------------------------------------
function squad_in_zone(actor, npc, p)
   local story_id = p[1]
   local zone_name = p[2]
   if story_id == nil then
      abort("Insufficient params in squad_in_zone function. story_id[%s], zone_name[%s]", tostring(story_id), tostring(zone_name))
   end
   if zone_name == nil then
      zone_name = npc:name()
   end

   local sim_board = sim_board.get_sim_board()

   local squad = get_story_squad(story_id)
   if squad == nil then
      --abort("There is no squad with id[%s]", tostring(squad_id))
      return false
   end

   local zone = db.zone_by_name[zone_name]
   if zone == nil then
      --abort("There is no squad with id[%s]", tostring(zone_name))
      return false
   end

   for k in squad:squad_members() do
      local position = (db.storage[k.id] and db.storage[k.id].object and db.storage[k.id].object:position()) or k.object.position
      if zone:inside(position) then
         return true
      end
   end
   return false
end

function squad_has_enemy(actor, npc, p)
   local story_id = p[1]

   if story_id == nil then
      abort("Insufficient params in squad_has_enemy function. story_id [%s]", tostring(story_id))
   end

   local squad = get_story_squad(story_id)
   if squad == nil then
      --abort("There is no squad with id[%s]", tostring(story_id))
      return false
   end

   local al = alife()
   for k in squad:squad_members() do
      local npc_obj = level.object_by_id(k.object.id)
      if npc_obj == nil then
         return false
      end
      if npc_obj:best_enemy() ~= nil then
         return true
      end
   end

   return false
end

-- Functions for Yantar
function squad_in_zone_all(actor, npc, p)
   local story_id = p[1]
   local zone_name = p[2]
   if story_id == nil or zone_name == nil then
      abort("Insufficient params in squad_in_zone_all function. story_id[%s], zone_name[%s]", tostring(story_id), tostring(zone_name))
   end
   local squad = get_story_squad(story_id)
   if squad == nil then
      --abort("There is no squad with id[%s]", tostring(story_id))
      return false
   end
   local zone = db.zone_by_name[zone_name]
   if zone == nil then
      --abort("There is no squad with id[%s]", tostring(zone_name))
      return false
   end
   local al = alife()
   for k in squad:squad_members() do
      local position = (db.storage[k.id] and db.storage[k.id].object and db.storage[k.id].object:position()) or k.object.position
      if not zone:inside(position) then
         return false
      end
   end
   return true
end

function squads_in_zone_b41(actor, npc, p)
   local smart = sim_board.get_sim_board():get_smart_by_name("jup_b41")
   local zone = db.zone_by_name["jup_b41_sr_light"]
   local al = alife()

   if zone == nil then
      return false
   end
   if smart == nil then
      return false
   end

   for k,v in pairs(sim_board.get_sim_board().smarts[smart.id].squads) do
      if v ~= nil then
         for j in v:squad_members() do
            if not zone:inside(j.object.position) then
               return false
            end
         end
      end
   end

   return true
end


--' Ďđîâĺđęŕ â ňŕđăĺň ęîíäëčńňĺ çŕäŕíč˙, ńîîňâĺňńňâóĺň ëč čě˙ ńęâŕäŕ ďĺđĺäŕííîěó
function target_squad_name(actor, obj, p)
   if p[1] == nil then
      abort("Wrong parameters")
   end
   if not(obj) then
      return false
   end
   --callstack()
   if IsStalker(obj) or IsMonster(obj) then
      if alife():object(obj.group_id) == nil then
         return false
      end
      if string.find( alife():object(obj.group_id):section_name(), p[1] ) ~= nil then
         return true
      end
      --return alife():object(obj.group_id):section_name() == p[1]
   end
   return obj:section_name() == p[1]
end

--' Ďđîâĺđęŕ â ňŕđăĺň ęîíäëčńňĺ çŕäŕíč˙, ńîîňâĺňńňâóĺň ëč čě˙ ńěŕđňŕ ďĺđĺäŕííîěó
function target_smart_name(actor, smart, p)
   if p[1] == nil then
      abort("Wrong parameters")
   end
   --callstack()
   return smart:name() == p[1]
end

--' Ďđîâĺđ˙ĺň ćčâ ëč îňđ˙ä ń óęŕçŕííűě ID
function squad_exist(actor, npc, p)
   local story_id = p[1]
   if story_id == nil then
      abort("Wrong parameter story_id[%s] in squad_exist function", tostring(story_id))
   end
   local squad = get_story_squad(story_id)

--   if squad == nil then
--      return false
--   end
   return squad ~= nil
   --   return squad.squad_power > 0
end

function is_squad_commander(actor, npc)
   if (type(npc.id) == "number") then
      npc_id = npc.id
   else
      npc_id = npc:id()
   end
   local squad = get_object_squad(npc)
   return squad ~= nil and squad:commander_id() == npc_id
end

function squad_npc_count_ge(actor, npc, p)
   local story_id = p[1]
   if story_id == nil then
      abort("Wrong parameter squad_id[%s] in 'squad_npc_count_ge' function", tostring(squad_id))
   end
   local squad = get_story_squad(story_id)

   if squad then
      return squad:npc_count() > tonumber(p[2])
   else
      return false
   end
end

function surge_complete()
   return surge_manager.is_finished()
end

function surge_started()
   return surge_manager.is_started()
end

function surge_kill_all()
   return surge_manager.is_killing_all()
end

function signal_rocket_flying(actor, npc, p)
   if p==nil then
      abort("Signal rocket name is not set!")
   end
   if db.signal_light[p[1]] then
      return db.signal_light[p[1]]:is_flying()
   else
      abort("No such signal rocket: [%s] on level", tostring(p[1]))
   end
   return false
end

function quest_npc_enemy_actor(actor, npc, p)
   if p[1] == nil then
      abort("wrong story id")
   else
      local obj = get_story_object(p[1])
      if obj and IsStalker(obj) then
         if db.actor and obj:general_goodwill(db.actor)<=-1000 then
            return true
         end
      end
   end
   return false
end

function animpoint_reached(actor, npc)
   local animpoint_storage = db.storage[npc:id()].animpoint

   if animpoint_storage == nil then
      return false
   end

   local animpoint_class = animpoint_storage.animpoint

   return animpoint_class:position_riched()
end

--[[
function npc_stay_offline(actor, npc, p)
   if p == nil then
      abort("Wrong parameter!!!")
   end
   if npc and db.actor then
      if is_smart_in_combat(actor, npc, p) then
         if npc.position:distance_to(db.actor:position())>=30 or game_relations.get_gulag_relation_actor(p[1], "enemy") then
            return true
         end
      end
   end
   return false
end
]]--

-- ďđîâĺđęŕ ňîăî ÷ňî äčńňŕíöč˙ äî îáüĺęňŕ >= çŕäŕííîé
-- ďŕđŕěĺňđű: [sid,dist]
function distance_to_obj_ge(actor, npc, p)
   local npc_id = get_story_object_id(p[1])
   local npc1 = npc_id and alife():object(npc_id)
   if npc1 then
      return db.actor:position():distance_to_sqr(npc1.position) >= p[2]*p[2]
   end
   return false
end

function distance_to_obj_le(actor, npc, p)
   local npc_id = get_story_object_id(p[1])
   local npc1 = npc_id and alife():object(npc_id)
   if npc1 then
      return db.actor:position():distance_to_sqr(npc1.position) < p[2]*p[2]
   end
   return false
end

function in_dest_smart_cover(actor, npc, p)
   return npc:in_smart_cover()
end

function active_item(actor, npc, p)
   if p and p[1] then
      for k,v  in pairs(p) do
         if actor:item_in_slot(3) ~= nil and actor:item_in_slot(3):section() == v then return true end
      end
   end
   return false
end

function actor_nomove_nowpn()
   if (not isWeapon(db.actor:active_item())) or db.actor:is_talking() then
      return true
   end
   return false
end

function jup_b16_is_zone_active(actor, npc)
   return has_alife_info(npc:name())
end

--Ôóíęöč˙ ďđîâĺđęč ńîńňî˙íč˙ âčäčěîńňč ęđîâîńîńŕ.
-- Âîçěîćíűé íŕáîđ ďŕđŕěĺňđîâ --> story_id:visibility_state(ěîćíî âűçűâŕňü îňęóäŕ óăîäíî) čëč visibility_state(ĺńëč âűçűâŕĺňń˙ čç ęŕńňîěäŕňű ęđîâîńîńŕ)
--  visibility_state -->
--                  0 - íĺâčäčěűé
--                  1 - ďîëóâčäčěűé
--                  2 - ďîëíîńňüţ âčäčěűé

function check_bloodsucker_state(actor, npc, p)
   if (p and p[1]) == nil then abort("Wrong parameters in function 'check_bloodsucker_state'!!!") end
   local state = p[1]
   if p[2] ~= nil then
      state = p[2]
      npc = get_story_object(p[1])
   end
   if npc ~= nil then
      return npc:get_visibility_state () == tonumber(state)
   end
   return false
end

function dist_to_story_obj_ge(actor, npc, p)
   local story_id = p and p[1]
   local story_obj_id = get_story_object_id(story_id)
   if story_obj_id == nil then return true end
   local se_obj = alife():object(story_obj_id)
   return se_obj.position:distance_to(db.actor:position()) > p[2]
end

function actor_has_nimble_weapon(actor, npc)
   local need_item = {}
   need_item["wpn_groza_nimble"] = true
   need_item["wpn_desert_eagle_nimble"] = true
   need_item["wpn_fn2000_nimble"] = true
   need_item["wpn_g36_nimble"] = true
   need_item["wpn_protecta_nimble"] = true
   need_item["wpn_mp5_nimble"] = true
   need_item["wpn_sig220_nimble"] = true
   need_item["wpn_spas12_nimble"] = true
   need_item["wpn_usp_nimble"] = true
   need_item["wpn_vintorez_nimble"] = true
   need_item["wpn_svu_nimble"] = true
   need_item["wpn_svd_nimble"] = true
   for k,v in pairs(need_item) do
      if actor:object(k) ~= nil then
         return true
      end
   end
   return false
end

function actor_has_active_nimble_weapon(actor, npc)
   local need_item = {}
   need_item["wpn_groza_nimble"] = true
   need_item["wpn_desert_eagle_nimble"] = true
   need_item["wpn_fn2000_nimble"] = true
   need_item["wpn_g36_nimble"] = true
   need_item["wpn_protecta_nimble"] = true
   need_item["wpn_mp5_nimble"] = true
   need_item["wpn_sig220_nimble"] = true
   need_item["wpn_spas12_nimble"] = true
   need_item["wpn_usp_nimble"] = true
   need_item["wpn_vintorez_nimble"] = true
   need_item["wpn_svu_nimble"] = true
   need_item["wpn_svd_nimble"] = true

   if actor:item_in_slot(2) ~= nil and need_item[actor:item_in_slot(2):section()] == true then
      return true
   end
   if actor:item_in_slot(3) ~= nil and need_item[actor:item_in_slot(3):section()] == true then
      return true
   end
   return false
end

function jup_b202_inventory_box_empty(actor, npc)
   local inv_box = get_story_object("jup_b202_actor_treasure")
   return inv_box:is_inv_box_empty()
end
--[[
function jup_b46_actor_has_active_science_detector(actor, npc)
   if actor:item_in_slot(9) ~= nil and actor:item_in_slot(9):section() == "detector_scientific" then return true end
   return false
end
]]--
function is_in_danger(actor, npc, p)
   if p and p[1] then
      npc = get_story_object(p[1])
   end
   --printf("npc: [%s] is in danger [%s]", tostring(npc:id()), tostring(db.storage[npc:id()].danger_flag))
   return db.storage[npc:id()].danger_flag
end

function object_exist(actor , npc , p)
   return get_story_object(p[1]) ~= nil
end

function squad_curr_action(actor, npc, p)
   local squad = get_object_squad(npc)
   return squad.current_action and squad.current_action.name == p[1]
end

function is_monster_snork(actor, npc)
   return npc:clsid() == clsid.snork_s
end

function is_monster_dog(actor, npc)
   return npc:clsid() == clsid.dog_s
end

function is_monster_psy_dog(actor, npc)
   return npc:clsid() == clsid.psy_dog_s
end

function is_monster_polter(actor, npc)
   return npc:clsid() == clsid.poltergeist_s
end

function is_monster_tushkano(actor, npc)
   return npc:clsid() == clsid.tushkano_s
end

function is_monster_burer(actor, npc)
   return npc:clsid() == clsid.burer_s
end

function is_monster_controller(actor, npc)
   return npc:clsid() == clsid.controller_s
end

function is_monster_flesh(actor, npc)
   return npc:clsid() == clsid.flesh_s
end

function is_monster_boar(actor, npc)
   return npc:clsid() == clsid.boar_s
end


function dead_body_searching(actor, npc)
   return actor_menu.dead_body_searching
end

function jup_b47_npc_online(actor, npc, p)
--   printf("function jup_b47_npc_online: story_obj[%s]", tostring(p[1]))
   local story_obj = get_story_object(p[1])
   if story_obj == nil then
      return false
   end
   local obj = alife():object(story_obj:id())
   return obj ~= nil
end

function anomaly_has_artefact(actor, npc, p)
   local az_name = p and p[1]
   local af_name = p and p[2]

   local anomal_zone = db.anomaly_by_name[az_name]
   if anomal_zone == nil then
      return false
   end

   if anomal_zone.spawned_count < 1 then
      return false
   end

   if af_name == nil then
      local af_table = {}
      for k,v in pairs(anomal_zone.artefact_ways_by_id) do
         if alife():object(tonumber(k)) then
            table.insert(af_table, alife():object(tonumber(k)):section_name())
         end
      end
      return true, af_table
   end

   for k,v in pairs(anomal_zone.artefact_ways_by_id) do
      if alife():object(tonumber(k)) and af_name == alife():object(tonumber(k)):section_name() then
         return true
      end
   end

   return false
end

function zat_b29_anomaly_has_af(actor, npc, p)
   local az_name = p and p[1]
   local af_name

   local anomal_zone = db.anomaly_by_name[az_name]
   if anomal_zone == nil then
      return false
   end

   if anomal_zone.spawned_count < 1 then
      return false
   end

   for i = 16, 23 do
      if has_alife_info(dialogs_zaton.zat_b29_infop_bring_table[i]) then
         af_name = dialogs_zaton.zat_b29_af_table[i]
         break
      end
   end

   for k,v in pairs(anomal_zone.artefact_ways_by_id) do
      if alife():object(tonumber(k)) and af_name == alife():object(tonumber(k)):section_name() then
         db.actor:give_info_portion(az_name)
         return true
      end
   end

   return false
end

function jup_b221_who_will_start(actor, npc, p) -- äîńňóďíűĺ ďŕđŕěĺňđű: ability - ďđîâĺđčňü ĺńňü ëč äîńňóďíűĺ ňĺěű, choose - âűáđŕňü ăđóďčđîâęó ęîňîđŕ˙ íŕ÷íĺň ďĺđĺďŕëęó
   local reachable_theme = {}
   local faction_table = {}
   local info_table = {
---------duty
      [1] = "jup_b25_freedom_flint_gone",
      [2] = "jup_b25_flint_blame_done_to_duty",
      [3] = "jup_b4_monolith_squad_in_duty",
      [4] = "jup_a6_duty_leader_bunker_guards_work",
      [5] = "jup_a6_duty_leader_employ_work",
      [6] = "jup_b207_duty_wins",
---------freedom
      [7] = "jup_b207_freedom_know_about_depot",
      [8] = "jup_b46_duty_founder_pda_to_freedom",
      [9] = "jup_b4_monolith_squad_in_freedom",
      [10] = "jup_a6_freedom_leader_bunker_guards_work",
      [11] = "jup_a6_freedom_leader_employ_work",
      [12] = "jup_b207_freedom_wins"
   }
--Ńîńňŕâë˙ĺě ňŕáëčöó äîńňűďíűő ňĺě(ňëüęî íîěĺđŕ ňĺě).
   for k,v in pairs(info_table) do
      if k <= 6 then
         faction_table[1] = "duty"
         faction_table[2] = "0"
      else
         faction_table[1] = "freedom"
         faction_table[2] = "6"
      end
      if (has_alife_info(v)) and (not has_alife_info("jup_b221_" .. faction_table[1] .. "_main_" .. tostring(k - tonumber(faction_table[2])) .. "_played")) then
         table.insert(reachable_theme,k)
         printf("jup_b221_who_will_start: table reachable_theme ------------------------------> [%s]", tostring(k))
      end
   end
   if (p and p[1]) == nil then
      abort("No such parameters in function 'jup_b221_who_will_start'")
   end
   if tostring(p[1]) == "ability" then
      return #reachable_theme ~= 0 -- ĺńëč ňŕáëčöŕ ďóńňŕ çíŕ÷čň íĺň äîńňóďíűő ňĺě č íĺíŕäî čăđŕňü ńöĺíó
   elseif  tostring(p[1]) == "choose" then
---------Âűáĺđĺě đŕíäîěŕě ĺëĺěĺíň ńîńňŕâëĺíîé ňŕáëčöű č ďđîâĺđčě ę ęŕęîé ăđóďĺđîâęč îí ďđĺíŕäëĺćčň :)
      return reachable_theme[math.random(1, #reachable_theme)] <= 6 -- ĺńëč ěĺíüřĺ 6-ňč çíŕ÷čň ÄÎËĂ ĺńëč áîëüřĺ 6-ňč çíŕ÷čň ŃÂÎÁÎÄŔ
   else
      abort("Wrong parameters in function 'jup_b221_who_will_start'")
   end
end

function pas_b400_actor_far_forward(actor, npc)
   local fwd_obj = get_story_object("pas_b400_fwd")

   if fwd_obj then
      if distance_between(fwd_obj, db.actor) > distance_between(fwd_obj, npc) then
         return false
      end
   else
      return false
   end

   local distance = 70 * 70
   local self_dist = npc:position():distance_to_sqr(actor:position())
   if self_dist < distance then
      return false
   end

   local squad = alife():object(alife():object(npc:id()).group_id)

   for k in squad:squad_members() do
      local other_dist = k.object.position:distance_to_sqr(actor:position())
      if other_dist < distance then
         return false
      end
   end

   --printf("npc: [%s], actor is far forward - self_dist [%s] distance [%s]", tostring(npc:name()), self_dist, distance)

   return true
end

function pas_b400_actor_far_backward(actor, npc)
   local bwd_obj = get_story_object("pas_b400_bwd")

   if bwd_obj then
      if distance_between(bwd_obj, db.actor) > distance_between(bwd_obj, npc) then
         return false
      end
   else
      return false
   end

   local distance = 70 * 70
   local self_dist = npc:position():distance_to_sqr(actor:position())
   if self_dist < distance then
      return false
   end

   local squad = alife():object(alife():object(npc:id()).group_id)

   for k in squad:squad_members() do
      local other_dist = k.object.position:distance_to_sqr(actor:position())
      if other_dist < distance then
         return false
      end
   end

   --printf("npc: [%s], actor is far backward - self_dist [%s] distance [%s]", tostring(npc:name()), self_dist, distance)

   return true
end

function pri_a28_actor_is_far(actor, npc)
   local distance = 150 * 150
   local squad = get_story_squad("pri_a16_military_squad")

   for k in squad:squad_members() do
      local npc_dist = k.object.position:distance_to_sqr(actor:position())
      if npc_dist < distance then
         return false
      end
   end

   return true
end

function check_enemy_smart(actor , npc , p)
   local enemy_id = db.storage[npc:id()].enemy_id
   local enemy = db.storage[enemy_id] and db.storage[enemy_id].object
   if enemy == nil or enemy_id == alife():actor().id then
      return false
   end
   local enemy_smart = xr_gulag.get_npc_smart(enemy)

   if (enemy_smart ~= nil) and (enemy_smart:name() == p[1]) then
      return true
   end
   return false
end

function zat_b103_actor_has_needed_food(actor, npc, p)
   return (dialogs_zaton.zat_b103_actor_has_needed_food(actor, npc)) or (has_alife_info("zat_b103_merc_task_done"))
end

function zat_b29_rivals_dialog_precond(actor, npc)
   local squads_table = {
                  "zat_b29_stalker_rival_default_1_squad",
                  "zat_b29_stalker_rival_default_2_squad",
                  "zat_b29_stalker_rival_1_squad",
                  "zat_b29_stalker_rival_2_squad"
                  }

   local zones_table = {
                  "zat_b29_sr_1",
                  "zat_b29_sr_2",
                  "zat_b29_sr_3",
                  "zat_b29_sr_4",
                  "zat_b29_sr_5",
                  }

   local f_squad = false

   for k,v in pairs(squads_table) do
      if alife():object(alife():object(npc:id()).group_id):section_name() == v then
         f_squad = true
         break
      end
   end

   if not f_squad then
      return false
   end

   for k,v in pairs(zones_table) do
      if utils.npc_in_zone(npc, db.zone_by_name[v]) then
         return true
      end
   end

   return false
end

function polter_ignore_actor(actor, npc)
   return npc:poltergeist_get_actor_ignore()
end

function burer_gravi_attack(actor, npc)
   return npc:burer_get_force_gravi_attack()
end

function burer_anti_aim(actor, npc)
   return npc:burer_get_force_anti_aim()
end

function jup_b202_actor_treasure_not_in_steal(actor, npc)
   local before = ((not has_alife_info("jup_b52_actor_items_can_be_stolen")) and (not has_alife_info("jup_b202_actor_items_returned")))
   local after  = (has_alife_info("jup_b52_actor_items_can_be_stolen") and has_alife_info("jup_b202_actor_items_returned"))
   return (before or after)
end

function jup_b25_senya_spawn_condition(actor, npc)
   return (has_alife_info("jup_b16_oasis_found") or has_alife_info("zat_b57_bloodsucker_lair_clear") or has_alife_info("jup_b6_complete_end") or has_alife_info("zat_b215_gave_maps")) and has_alife_info("zat_b106_search_soroka")
end

function jup_b25_flint_gone_condition(actor, npc)
   return has_alife_info("jup_b25_flint_blame_done_to_duty") or has_alife_info("jup_b25_flint_blame_done_to_freedom") or has_alife_info("zat_b106_found_soroka_done")
end

-------------------------------------------------------------------------------------------------------------------------------------------
--   STALKER TRADE FUNCTIONS
-------------------------------------------------------------------------------------------------------------------------------------------
function has_tradable_stuff(actor, npc)


end


-------------------------------------------------------------------------------------------------------------------------------------------
--   end of STALKER TRADE FUNCTIONS
-------------------------------------------------------------------------------------------------------------------------------------------


pioneer_functor = xr_statistic.pioneer_functor

mutant_hunter_functor = xr_statistic.mutant_hunter_functor

detective_functor = xr_statistic.detective_functor

one_of_the_lads_functor = xr_statistic.one_of_the_lads_functor

kingpin_functor = xr_statistic.kingpin_functor

herald_of_justice_functor = xr_statistic.herald_of_justice_functor

seeker_functor = xr_statistic.seeker_functor

battle_systems_master_functor = xr_statistic.battle_systems_master_functor

high_tech_master_functor = xr_statistic.high_tech_master_functor

skilled_stalker_functor = xr_statistic.skilled_stalker_functor

leader_functor = xr_statistic.leader_functor

diplomat_functor = xr_statistic.diplomat_functor

research_man_functor = xr_statistic.research_man_functor

friend_of_duty_functor = xr_statistic.friend_of_duty_functor

friend_of_freedom_functor = xr_statistic.friend_of_freedom_functor

balance_advocate_functor = xr_statistic.balance_advocate_functor

wealthy_functor = xr_statistic.wealthy_functor

keeper_of_secrets_functor = xr_statistic.keeper_of_secrets_functor

marked_by_zone_functor = xr_statistic.marked_by_zone_functor

information_dealer_functor = xr_statistic.information_dealer_functor

friend_of_stalkers_functor = xr_statistic.friend_of_stalkers_functor


--------------------------------------------------------------------------------
function check_deimos_phase(actor, npc, p)
   if(p[1] and p[2]) then
      local obj = db.storage[npc:id()]
      local delta = sr_deimos.check_intensity_delta(obj)
            if(p[2]=="increasing" and delta) then
                  return false
            elseif(p[2]=="decreasing" and not(delta)) then
                  return false
            end
      if(p[1]=="disable_bound") then
         if(p[2]=="increasing") then
                        if not(sr_deimos.check_disable_bound(obj)) then
               return true
            end
         elseif(p[2]=="decreasing") then
                        return sr_deimos.check_disable_bound(obj)
         end
      elseif(p[1]=="lower_bound") then
         if(p[2]=="increasing") then
                        if not(sr_deimos.check_lower_bound(obj)) then
               return true
            end
         elseif(p[2]=="decreasing") then
                        return sr_deimos.check_lower_bound(obj)
         end
      elseif(p[1]=="upper_bound") then
         if(p[2]=="increasing") then
                        if not(sr_deimos.check_upper_bound(obj)) then
               return true
            end
         elseif(p[2]=="decreasing") then
                        return sr_deimos.check_upper_bound(obj)
         end
      end
   end
end

--------------------------------------------------------------------------------

function actor_in_surge_cover(actor, npc, p)
   return surge_manager.actor_in_cover()
end

function is_door_blocked_by_npc(actor, obj)
   return obj:is_door_blocked_by_npc()
end

function has_active_tutorial()
   return game.has_active_tutorial()
end

function upgrade_hint_kardan(actor, npc, p)
   local hint_table = {}
   local can_upgrade = 0
   local tools = (p and tonumber(p[1])) or 0

   if not has_alife_info("zat_b3_all_instruments_brought") then
      if not has_alife_info("zat_b3_tech_instrument_1_brought") and (tools == 0 or tools == 1) then
         table.insert(hint_table, "st_upgr_toolkit_1")
      elseif tools == 1 then
         can_upgrade = can_upgrade + 1
      end
      if not has_alife_info("zat_b3_tech_instrument_2_brought") and (tools == 0 or tools == 2) then
         table.insert(hint_table, "st_upgr_toolkit_2")
      elseif tools == 2 then
         can_upgrade = can_upgrade + 1
      end
      if not has_alife_info("zat_b3_tech_instrument_3_brought") and (tools == 0 or tools == 3) then
         table.insert(hint_table, "st_upgr_toolkit_3")
      elseif tools == 3 then
         can_upgrade = can_upgrade + 1
      end
   else
      can_upgrade = can_upgrade + 1
   end

   if not has_alife_info("zat_b3_tech_see_produce_62") then
      if (tools == 1) and not has_alife_info("zat_b3_tech_have_one_dose") then
         table.insert(hint_table, "st_upgr_vodka")
      elseif (tools ~= 1) and (not has_alife_info("zat_b3_tech_have_couple_dose")) then
         table.insert(hint_table, "st_upgr_vodka")
      else
         can_upgrade = can_upgrade + 1
      end
   else
      can_upgrade = can_upgrade + 1
   end

   inventory_upgrades.cur_hint = hint_table

   return can_upgrade >= 2
end

-- AtmosFear Fallout
function fallout_complete()
   return fallout_manager.is_finished()
end


Bylbym wdzieczny :wódka: gdyby ktos o ile to mozliwe dokonal "fuzji" tych plikow tak zeby mody sie nie gryzly i podal kod do przekopiowania :D
Image
Awatar użytkownika
impulse_101
Legenda

Posty: 1305
Dołączenie: 20 Sty 2009, 16:47
Ostatnio był: 08 Lut 2020, 16:44
Frakcja: Czyste Niebo
Ulubiona broń: Viper 5
Kozaki: 275

Re: Chcesz moda? Wal!

Postprzez lukass w 12 Cze 2010, 16:02

A probowałeś nadpisać main_menu Atmosfeara tym samym plikiem z Władcy Zony?
Skrypt atmosfeara różni się głównie(a może tylko) funkcjami stereowania pogodą i czasem, które są we Władcy.
Mam pirata!
Awatar użytkownika
lukass
Ekspert

Posty: 827
Dołączenie: 25 Paź 2009, 13:18
Ostatnio był: 07 Sie 2010, 12:16
Ulubiona broń: --
Kozaki: 45

Re: Chcesz moda? Wal!

Postprzez Cysiu w 12 Cze 2010, 17:48

Mam prośbę. Otóż, w czasie gry nie spodobała mi się jedna rzecz, a mianowicie: kiedy zbierasz rzeczy z ziemi nasz Major bierze wszystko wokół, a ja chciałbym, żeby brał tylko to, co ma na obrazku przed sobą (wiecie o co mi chodzi).

Za ten post Cysiu otrzymał następujące punkty reputacji:
Positive MatrixSTR.
Awatar użytkownika
Cysiu
Stalker

Posty: 193
Dołączenie: 07 Maj 2009, 19:46
Ostatnio był: 20 Kwi 2023, 23:35
Miejscowość: Szczecin
Kozaki: 84

Re: Chcesz moda? Wal!

Postprzez Nyguz w 12 Cze 2010, 17:54

Ja też mam pytanie. Czy istnieje mod do ZEWU PRYPECI dodający widok z maski?? Chcę widzieć, że mam maskę na głowie... :D
CPU: i7 7700 GPU: Gigabyte RTX2060 Super RAM: 16GB DDR4 PSU: Be-Quiet 750W
Ludzie wierzą w to, że system zmieni sytuację w miastach... kiedyś wierzyli, że Ziemia jest płaska.
Awatar użytkownika
Nyguz
Weteran

Posty: 646
Dołączenie: 26 Mar 2010, 13:52
Ostatnio był: 25 Cze 2021, 00:49
Frakcja: Samotnicy
Ulubiona broń: GP 37
Kozaki: 112

Re: Chcesz moda? Wal!

Postprzez lukass w 12 Cze 2010, 18:08

Proszę bardzo, dynamiczny HUD raz...
http://www.gsc-game.com/index.php?t=com ... r3&lang=en

A tutaj to samo z niewielkimi zmianami
http://privat.bahnhof.se/wb220832/stalk ... nload.html
Mam pirata!

Za ten post lukass otrzymał następujące punkty reputacji:
Positive von Carstein.
Awatar użytkownika
lukass
Ekspert

Posty: 827
Dołączenie: 25 Paź 2009, 13:18
Ostatnio był: 07 Sie 2010, 12:16
Ulubiona broń: --
Kozaki: 45

Re: Chcesz moda? Wal!

Postprzez Nyguz w 12 Cze 2010, 18:13

Dzięki wielkie :E Ok już mam. :) Dzięki wielkie jeszcze raz :wódka:
CPU: i7 7700 GPU: Gigabyte RTX2060 Super RAM: 16GB DDR4 PSU: Be-Quiet 750W
Ludzie wierzą w to, że system zmieni sytuację w miastach... kiedyś wierzyli, że Ziemia jest płaska.
Awatar użytkownika
Nyguz
Weteran

Posty: 646
Dołączenie: 26 Mar 2010, 13:52
Ostatnio był: 25 Cze 2021, 00:49
Frakcja: Samotnicy
Ulubiona broń: GP 37
Kozaki: 112

PoprzedniaNastępna

Powróć do Zew Prypeci

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 5 gości