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

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

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

  1. Dennis Chikin

    Dennis Chikin Модератор

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

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

    Dennis Chikin Модератор

    486
    183
    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
    basil, DrDron и yurv3 нравится это.
  3. Dennis Chikin

    Dennis Chikin Модератор

    486
    183
    3 мар 2019
    Мужской
    Мва-ха-ха... Закрывание второй двери в бункере кругловым - ЖЕЛЕЗОЗАВИСИМОЕ. Ну или "количествообъектоввигрезависмое" Не успел - опоздал, и вот фиг она теперь закроется.
    Для этого Круглову организовывали искусственный тупняк в дверях.
    Продублировал закрывалку. Точнее, добавил до переключения, после которого оно проверялось раньше.
     
    yurv3 нравится это.
  4. Dennis Chikin

    Dennis Chikin Модератор

    486
    183
    3 мар 2019
    Мужской
    play() и playing()

    Звук начинает играться не сразу, а с некоторой небольшой задержкой. При этом playing() проверяет не то, что мы просили проиграть звук и он еще не кончился, а играется ли вот прямо сейчас. Поэтому, если у нас задержка проверки не организована иначе, нужно проверять и на то, что еще НЕ вышло некоторое небольшое время, И что звук играется.

    Собственно, по этой причине неписям запрещают диалог с актором, пока не проиграна приветственная (или еще какая) фраза. (Тоже так себе решение, поскольку Петрухино "не шелести" нужно, чтобы обратить внимание пробегающего мимо игрока, а не заставить его ждать, пока тот Петруха закончит губами шевелить. Впрочем, на счет цели того же Сяка с его "должно быть не легко и не радостно" - не у верен. 8/ )
     
    Последнее редактирование: 28 янв 2022
    basil и yurv3 нравится это.
  5. Dennis Chikin

    Dennis Chikin Модератор

    486
    183
    3 мар 2019
    Мужской
    Кстати, sound_object() с несуществующим путем создает вполне себе sound_object, и можно даже запустить его проигрывание. Вот только звука нет. ;)
    Стандартные ошибки при этом - пропуск экранирования или ошибка в относительном пути. Все звуки растут от gamedata\sounds, а не от gamedata и не от character_voices.

    Ну и учитывайте, что если файлы не упакованы в db, то в чуть больше 200 символов должен влезть не относительный, а АБСОЛЮТНЫЙ путь. То есть, если верите, что пользователь способен установить сталкера так, что путь к нему - 100 символов, вам остается примерно столько же под все про все. Упаковка остроту проблемы несколько снижает, но не так, чтобы радикально.
     
    Последнее редактирование: 28 янв 2022
    basil нравится это.
  6. Dennis Chikin

    Dennis Chikin Модератор

    486
    183
    3 мар 2019
    Мужской
    стартовый диалог для раненых прописываем вот так:
    [wounded]
    ...
    help_start_dialog = tutorial_wounded_give_medkit

    А не start_dialog и не в meet. Тогда он для этого непися под логикой подхватывается вместо того, который в профиле.
    Есть еще просто help_dialog - это дополнительный диалог "от актора", если стартового мало.
    В профиле "альтернативный стартовый диалог" писать и обвешивать условиями не нужно. Если непись ранен и в логике альтернативного нет - будет дефолтный, если прописали явно - стартует заданный, если непись не ранен - будет обычный диалогменеджер работать.

    Upd: хм, восстановление диалога в xr_meet сделано неправильно, так что не восстановится. Пока сделал восстановление в xr_wounded же. А так надо везде перелопачивать.
    А с просто help_dialog - какие-то странные танцы с бубном, и надо разбираться. Но в любом случае это точно не то, что надо для сценарных случаев.

    Хотя, опять же, вообще надо сценарных раненых делать на remarkах, с переходом туда из walker по условию. Именно для того, чтобы был полный контроль над сценой.
     
    Последнее редактирование: 2 фев 2022
    basil нравится это.
  7. Dennis Chikin

    Dennis Chikin Модератор

    486
    183
    3 мар 2019
    Мужской
    Циклические квесты...

    ~info~ [task_manager] check_task_props: tm_eliminate_camp_4, target: 719, pop: 3
    ~info~ [task_manager] map: tm_eliminate_camp_4_text
    ~info~ [task_manager] action_give_task, eliminate_lager, tm_eliminate_camp_4, tm_eliminate_camp_4_descr, target: 719
    ~log~ [bind_stalker] task_callback: eliminate_lager_trader, userdata, 1
    и понесла-ась... 5 раз в секунду проверочки. Если синхронизация с монитором включена. Иначе еще более зверски:
    ~info~ [task_manager] task_complete, eliminate: tm_eliminate_camp_4, target: 719, userdata
    ~info~ [task_manager] task_complete, eliminate: tm_eliminate_camp_4, target: 719, userdata
    ~info~ [task_manager] task_complete, eliminate: tm_eliminate_camp_4, target: 719, userdata
    ~info~ [task_manager] task_complete, eliminate: tm_eliminate_camp_4, target: 719, userdata
    ~info~ [task_manager] task_complete, eliminate: tm_eliminate_camp_4, target: 719, userdata
    ~info~ [task_manager] task_complete, eliminate: tm_eliminate_camp_4, target: 719, userdata
    Больше, больше квестиков, хороших и разных! И обязательно с проверками в самом задании!
     
  8. Dennis Chikin

    Dennis Chikin Модератор

    486
    183
    3 мар 2019
    Мужской
    Внезапно, шейдеры.
    shaders\r2\combine_1.ps
    Код:
    // here should be distance fog
       float3   pos = P.xyz;
       float   distance = length( pos );
       float   fog = saturate( distance * fog_params.w + fog_params.x );
           color = lerp( color, fog_color, fog );
       half   skyblend = saturate( fog * 4 ) * 0.25;   //  * fog
    
    Вот это уже попытка правки, наскоро, задней левой ногой. Подозреваю, что вообще-то в последней строке должна быть нормализация, но так чуть более чем везде ее либо нет вообще, либо half skyblend = saturate( fog * fog ) -- то есть, используется квадрат значений, которые заведомо МЕНЬШЕ единицы, результат слегка предсказуем:
    ss_dc_01-18-22_00-23-20_(l01_escape).jpg ss_dc_01-17-22_22-35-05_(l12_stancia).jpg
    Ну и прочие контуры труб и иных странных конструкций.

    Фикс, конечно, так себе, и надо дорабатывать. Подозреваю, что здесь еще надо коэффициентик для дистанции, что-то типа 0.9, и с диапазоном интерполяции разобраться. Сейчас - слишком грубо. Но по крайней мере fog_plane и fog_color начали делать то, что должны:
    ss_dc_02-19-22_00-15-48_(l12_stancia_2).jpg
     
    Последнее редактирование: 23 фев 2022
    basil нравится это.
  9. Dennis Chikin

    Dennis Chikin Модератор

    486
    183
    3 мар 2019
    Мужской
    Сегодня не записки, а целая видеозапись.

    www.youtube.com/watch?v=4d3M_mev9gw
    Коротко: не смотря на утверждения всяческих "Гуру" с разных форумов, ВСЁ работает во ВСЕХ режимах, если специально не пакостить. Если испакостить - все равно работает, но испакощено.
     
    basil, blockpost и yurv3 нравится это.

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