1. Для общения на форуме, в чате или личной переписке наличие аватара ОБЯЗАТЕЛЬНО!

Прозекторская

Тема в разделе "Диетическая Солянка 2016", создана пользователем Dennis Chikin, 2 ноя 2019.

  1. Dennis Chikin

    Dennis Chikin Модератор

    250
    78
    3 мар 2019
    Мужской
    "Вскрытие показало, что больной умер от вскрытия." (C)
    В общем, тема, аналогичная той, что была на амк, но в основном про то, что делаю я. То есть, в настоящее время - преимущественно про "солянку": как что работает, и как это можно использовать.

    Организация заметок - как придется, поскольку чем занят, и что посчитаю нужным/интересным, про то и буду писать.
     
  2. Dennis Chikin

    Dennis Chikin Модератор

    250
    78
    3 мар 2019
    Мужской
    (xr_logic)
    По ходу бобрьбы со звуками, лампочками и прочими рычагами в x16 меня, наконец, окончательно достало, и сделано то, что надо было сделать давно:
    добавил в нежно любимую логику условие "select". То есть, вместо адовых конструкций с черточками и закорючками пишем select = module.function

    Туда передается вызвавший, обратно - секция, на которую над перейти. Или не возвращается, если переходить не надо Все необходимое пишем нормальным lua.
    Кроме того в профите - быстрая загрузка, быстрое выполнение, а не медленное и печальное копирование тудыть-судыть монстровидных строк.
    xr_logic.script

    Выглядит примерно так:
    Код:
    [logic]
    active = ph_button@init
    
    [ph_button@init]
    anim = lab_primary_switcher_idle
    select = xl_story_l08u_brainlab.sw_main_init
    
    [ph_button@active]
    anim = lab_primary_switcher_idle
    tooltip = tips_labx16switcher_press
    on_press = ph_button@deactivate %=xl_story_l08u_brainlab.sw_main_off%
    
    [ph_button@deactivate]
    anim = lab_primary_switcher_off
    select = xl_story_l08u_brainlab.sw_main_sw
    
    [ph_button@inactive]
    anim = lab_primary_switcher_off
    
    как выглядит, например, xl_story_l08u_brainlab.sw_main_init():
    Код:
    function sw_main_sw( item )
        if actor:has_info( "yan_labx16_switcher_primary_try" ) then
           actor:disable_info_portion( "yan_labx16_switcher_primary_try" )
           return "ph_button@active"
       end
       if actor:has_info( "yan_labx16_switcher_primary_off" ) then return "ph_button@inactive" end
       return "ph_button@active"
    end
    
    Всякие звуки, мигания лампочками, спавны зомбей, обновления заданий - все внутри вызываемого по select.

    Выбор работ в смартах, чтобы гонять неписей в нужное место в офлайне, а не бегали тудыть-сюдыть после загрузки - это, к сожалению, не здесь. Но там тоже будет.

    Сами изменения в коде:
    Код:
    function cfg_get_switch_conditions( ini, sect, npc )
    
       if ini and sect and npc then
       else return {}
       end
    
       local t, n = {}, 0
       local function add_cond( func, cond )
           local c = func( ini, sect, cond, npc )
           local i = 1
           while c do
               if c then n = n + 1; t[n] = c end
               i = i + 1   -- добавляем к on_info: on_info2, on_info3 и т.д.
               c = func( ini, sect, cond .. i, npc )
       end   end
    
       add_cond( cfg_get_number_and_condlist,   "on_actor_dist_le" )
       add_cond( cfg_get_number_and_condlist,   "on_actor_dist_le_nvis" )
       add_cond( cfg_get_number_and_condlist,   "on_actor_dist_ge" )
       add_cond( cfg_get_number_and_condlist,   "on_actor_dist_ge_nvis" )
       add_cond( cfg_get_string_and_condlist,   "on_signal" )
       add_cond( cfg_get_condlist,       "on_info" )
       add_cond( cfg_get_number_and_condlist,   "on_timer" )
       add_cond( cfg_get_number_and_condlist,   "on_game_timer" )
       add_cond( cfg_get_string_and_condlist,   "on_actor_in_zone" )
       add_cond( cfg_get_string_and_condlist,   "on_actor_not_in_zone" )
       add_cond( cfg_get_condlist   , "on_actor_inside" )
       add_cond( cfg_get_condlist   , "on_actor_outside" )
       add_cond( cfg_get_npc_and_zone   , "on_npc_in_zone" )
       add_cond( cfg_get_npc_and_zone   , "on_npc_not_in_zone" )
       if ini:line_exist( sect, "select" ) then
           t.select = ini:r_string( sect, "select" )
       end
    
       return t
    end
    
    добавлено:
       if ini:line_exist( sect, "select" ) then
           t.select = ini:r_string( sect, "select" )
       end
    
    function try_switch_to_another_section( npc, st, actor )
    ...
        for n, c in ipairs( l ) do
           n = chk[string_match( c.name, "^([%D]+)" )]
           if n then
               if n( c ) then
                   n = pick_section_from_condlist( actor, npc, c.condlist )
                   if n and n ~= "" then
                       n = switch_to_section( npc, st, n )
                       if n then return n end
               end   end
           else abort( "try_switch_to_another_section, invalid cnd: >>%s<<, (%s)", c.name, to_str( npc ) )
           end
       end
    
       if l.select then
           local m, f = string_match( l.select, "(.+)[.](.+)" )
           if f then m = _G[m]; f = ( m and m[f] )   -- m - скрипт
           else f = xr_conditions[l.select]   -- f определено в xr_conditions
           end
           if f then
               m = f( npc )
               if m then
                   m = switch_to_section( npc, st, m )
                   if m then return m end
               end
           else abort( "try_switch_to_another_section, no [xr_conditions.]%s (%s)", l.select, to_str( npc ) )
           end
       end
       return false
    end
    
    изменено: for n, c in pairs( l ) do на for n, c in ipairs( l ) do
    чтобы читались только записи с последовательными числовыми индексами
    
    добавлено:
        if l.select then
           local m, f = string_match( l.select, "(.+)[.](.+)" )
           if f then m = _G[m]; f = ( m and m[f] )   -- m - скрипт
           else f = xr_conditions[l.select]   -- f определено в xr_conditions
           end
           if f then
               m = f( npc )
               if m then
                   m = switch_to_section( npc, st, m )
                   if m then return m end
               end
           else abort( "try_switch_to_another_section, no [xr_conditions.]%s (%s)", l.select, to_str( npc ) )
           end
       end
    
     
    Последнее редактирование: 3 ноя 2019
    DrDron и yurv3 нравится это.

Поделиться этой страницей