Перейти к контенту
Dennis_Chikin

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

Рекомендуемые сообщения

"Вскрытие показало, что больной умер от вскрытия."

Тема для "крупной формы", то есть, на уровне скриптов целиком или больших частей оных скриптов. "Что у него внутри, зачем оно там, и что с этим можно сделать ?"

Изменено пользователем Dennis_Chikin
Ссылка на комментарий
И мне не нравится elseif-простыня, ПЕРЕД которой дергается parse_func_params.

parse_func_params будет дергаться только тогда, когда определиться что функция имеет параметры, а не каждый цикл.

 

Но если хочется, то можно записать и несколько по-другому, но более запутано что-ли

 

function parse_infop(rslt, str)
    if str then
        local infop_n = 1
        for sign, infop_name in string.gmatch(str, "(%S)([^%-%+%~%=%!%s]+)") do
            if sign == "+" then
                rslt[infop_n] = { name = infop_name, required = true }
            elseif sign == "-" then
                rslt[infop_n] = { name = infop_name, required = false }
            elseif sign == "~" then
                rslt[infop_n] = { prob = tonumber(infop_name) }
            elseif sign == "=" or sign == "!" then
                -- парсим параметры функций
                local func, param = infop_name:match('^(.-)(%b())')
                if param then
                    param = parse_func_params(param:match('%((.-)%)'))
                    infop_name = func or infop_name
                end
                rslt[infop_n] = { func = infop_name, expected = (sign == "="), params = param}
            else
                abort("function 'parse_infop' --> sign '%s': infop_name '%s':", sign, infop_name)
            end
            infop_n = infop_n + 1
        end
    end
end 

 

.....

 

 

Ну тут уже на вкус и цвет. Как по мне, то простыня понятнее.

Тогда уже нужно доделывать и инфопорции в этом стиле

 

 function parse_infop(rslt, str)
    if str then
        local infop_n = 1
        for sign, infop_name in string.gmatch(str, "(%S)([^%-%+%~%=%!%s]+)") do
            if sign == "+" or sign == "-" then
                rslt[infop_n] = { name = infop_name, required = (sign == "+") }
            elseif sign == "~" then
                rslt[infop_n] = { prob = tonumber(infop_name) }
            elseif sign == "=" or sign == "!" then
                -- парсим параметры функций
                local func, param = infop_name:match('^(.-)(%b())')
                if param then
                    param = parse_func_params(param:match('%((.-)%)'))
                    infop_name = func or infop_name
                end
                rslt[infop_n] = { func = infop_name, expected = (sign == "="), params = param}
            else
                abort("function 'parse_infop' --> sign '%s': infop_name '%s':", sign, infop_name)
            end
            infop_n = infop_n + 1
        end
    end
end 

 

 

 

@Dennis_Chikin

Когда будет готово, перезалей xr_logic с новыми правками. А то не ясно, что ты изменил(изменишь) а что нет.

В switch_to_section нужно кэшировать db.storage[npc:id()]

 

function switch_to_section( npc, st, section )
    if section == nil or section == "" or
    (section == "sr_aes_deadzone" and has_alife_info( "strelok_pda_have" )) then return false end
        
    local npc_storage    = db.storage[npc:id()]
    local active_section = npc_storage.active_section
        
    if active_section == section then return false end

    if active_section then
        issue_event(npc, npc_storage[npc_storage.active_scheme], "deactivate", npc)
    end
        
    npc_storage.active_section = nil
    npc_storage.active_scheme  = nil
        
    activate_by_section( npc, st.ini, section, false )
    
    return true
end 

 

 

В функции parse_func_params у меня используется шаблон '[^%s:]+'

Я не проверял, поверил разработчикам lua на слово, но элемент '*' (звездочка) называют "прожорливым".

Сначала считывается вся строка, а потом уже идет разбор.

При '[^%s:]+' сразу идет разбор строки.

Изменено пользователем Nazgool
Добавлено Dennis_Chikin,

Ага, вот уже на что-то вменяемое похоже...

  • Нравится 1
Ссылка на комментарий

Эээ, а приколоть можете где strelok_pda_have пользуется?

 

%b таки очень хороший шаблон, в свое время довольно часто его использовал, при парсинге тех же секций кстати говоря.

Изменено пользователем Карлан
Ссылка на комментарий

А это типа отключение выброса на АЭС от какого-то древнего nlc3.

Оттуда же сохранение каких-то странных телепортов в нетпакет пда - не до конца вычистил.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

В общем где-то мы тут обсуждали собственно что за чем считывается (ТЧ), по архивам, чтобы в ковырялках не затерялось запостю запощу  :facepalm: напишу тут.

 

1. .db* по алфавиту

2. gamedata

3. .xdb* по алфавиту

 

Да, я понимаю что я на русском форуме, но может кому будет надо.

  • Полезно 3
Ссылка на комментарий
@Карлан, лучше в справочник по функциям и классам запостить, имхо. Хотя, тут не особо много постов, найти при надобности тоже просто. Изменено пользователем Shadows
Ссылка на комментарий

Сейчас, как вы поняли, я занимаюсь реструктуризацией, и нашел забавную цепочку мусора, а именно:

 

ce_switcher.script

se_switcher.script

trigger.ltx

 

Можно выпиливать, тесты ничего фатального не выявили. В любом случае если оно как-то где-то и надо, то сами видите где это есть ;).

Ссылка на комментарий

Возможно я чего-то не понимаю...

 

task_manager.script

function CRandomTask:save(p)
    ...
    p:w_u32(v.selected_target or -1)
беззнаковое целое не может быть -1, поэтому сохраняется 4294967295 (что логично)

 

загрузка:

function CRandomTask:load(p)
    ...
    local selected_target = p:r_u32()
    if selected_target ~= -1 then
        self.task_info[id].selected_target = selected_target
какое нахрен -1???

Причем ниже, они из этого числа хотят получить игровой объект.

if self.task_info[id].type == "defend_lager" then
    local defend_object = alife():object(self.task_info[id].selected_target)
А теперь вопрос - как оно вообще работает? o_O

 

Добавляю вывод в консоль:

if self.task_info[id].type == "defend_lager" then                                                           
    local defend_object = alife():object(self.task_info[id].selected_target)                                  
    local sm_ini = defend_object:spawn_ini()  
 
    log1("defend_object selected_target = "..self.task_info[id].selected_target.." name = "..defend_object:name())
 
    self.task_info[id].defend_target = utils.cfg_get_number(sm_ini, "random_task", "defend_target", nil, true)
end
результат:

defend_object selected_target = 4294967296 name = single_player
И так для каждого задания "defend_lager". WTF. Изменено пользователем Shadows
  • Нравится 1
Ссылка на комментарий

,

вроде с кодом все нормально. -1 - магическая константа = "цель не выбрана". Если посмотришь на код внимательней, то по -1 объект не получают.

-1 в selected_target, а объект получают по self.task_info[id].selected_target, куда -1 так и не присвоили.

 

А глюк с 4294967295 и 4294967296 - отдельный глюк.

  • Не нравится 1

Подарки

  • Ссылка на комментарий

    1) условие if selected_target ~= -1 then не имеет смысла, так как u32 никогда не может быть -1, следовательно self.task_info[id].selected_target всегда равно значению p:r_u32()
    2) после чего они пытаются из этого числа получить объект и даже не проверяют есть ли он вообще (!)
    3) зачем вообще сохранять для заданий это значение, если оно всегда равно -1 (на save), а следовательно всегда (на load) получается (подразумевается) актор
     

    вроде с кодом все нормально.

    Там ничего нормального нет - весь код сплошной ахтунг.
     

    Если посмотришь на код внимательней, то по -1 объект не получают.

    Причем ниже, они из этого числа хотят получить игровой объект.

    Я имел ввиду число selected_target, а не -1.

    Изменено пользователем Shadows
    Ссылка на комментарий

    3) зачем вообще сохранять для заданий это значение, если оно всегда равно -1 (на save), а следовательно всегда (на load) получается (подразумевается) актор

    Как ты понял, что всегда равно -1?

    Из кода:

    p:w_u32(v.selected_target or -1)
    я вижу, что оно может быть число или null. Если null, то вместо null, пишем -1.

    Подарки

  • Ссылка на комментарий
    Как ты понял, что всегда равно -1?

    В ходе практических тестов и вывода сохраняемых значений в лог на оригинальной игре.

     

    Если null, то вместо null, пишем -1.

    А то что -1 пишем в u32 не смущает?

    Изменено пользователем Shadows
    • Согласен 1
    Ссылка на комментарий

    А то что -1 пишем в u32 не смущает?

    Почему меня это должно смущать? В с++ -1 прекрасно пишется в u32 и читается обратно.
    • Не нравится 4

    Подарки

  • Ссылка на комментарий

    В с++ -1 прекрасно пишется в u32 и читается обратно.

     

    EIniI9J6t2s.jpg

     

    Пруф?

    Изменено пользователем Shadows
    • Нравится 2
    • Не нравится 1
    Ссылка на комментарий

     

     

    Пруф?

    Присоединяюсь к вопросу, аж любопытно стало.

    Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

    Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

    AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

    Ссылка на комментарий

    Итак, пачка вопросов от меня снова:

     

    1. Что есмь fx_sound.script ? Они нигде не применяется, я так понимаю это какая-то обертка чтобы отыгрывать звуки где хочется? Но функционал уже итак нормальный заряжен. В общем я собираюсь выпиливать, ваше какое мнение?

     

    2. dream.script, sr_sleep.script, хвосты есть в all.spawn, но полностью мертвые, то есть их оттуда надо выкидывать 100%. Сон надо делать совершенно по другому, так что это я тоже выпиливаю.

     

    Сейчас, к слову, у меня вся игра на 168 скриптах работает, против 441 (если не путаю) в оригинале.

    Ссылка на комментарий

    2. dream.script, sr_sleep.script, хвосты есть в all.spawn, но полностью мертвые, то есть их оттуда надо выкидывать 100%. Сон надо делать совершенно по другому, так что это я тоже выпиливаю.

    "sr_" - логика рестриктора. Сюжетный сон со сновидениями. Зачем его выпиливать? Может его кто использует? И кстати как ты его по-другому сделаешь: основа всего в сталкере.

     

    Сейчас, к слову, у меня вся игра на 168 скриптах работает, против 441 (если не путаю) в оригинале.

    Что есть "выпиливание"? Все "выпиленные скрипты все равно остаются в db. А использовались в оригинале также далеко не все.

    Подарки

  • Ссылка на комментарий
    "sr_" - логика рестриктора. Сюжетный сон со сновидениями. Зачем его выпиливать? Может его кто использует? И кстати как ты его по-другому сделаешь: основа всего в сталкере.

    Спасибо, что sr - space restrictor это я еще в юности понял. Лол, с чего вдруг это сюжетный сон? Эта логика к сюжетным снам отношения никакого не имеет, смотри соотв. скрипты. Основа, прости, что и чего? По другому я его сделаю как в ЗП например, сорсы же ;).

     

     

     

    Что есть "выпиливание"? Все "выпиленные скрипты все равно остаются в db. А использовались в оригинале также далеко не все.

    Есть то, что и db перепакованы. Так что я знаю о чем говорю ;).

    Изменено пользователем Карлан
    Ссылка на комментарий

    Для тех кто кругом видит свежезакопанные велосипеды маскирующиеся под "сверх-новейшие скриптовые штуковины"

    А так же любителей копаться в сыром и неготовом коде.

     

    http://rghost.ru/6YYfr8GjH- инвентарь Судьбы Зоны, собственной персоной, как есть. Многие классы/методы не используются, не вызываются, являются рудиментами двухлетней давности или еще что нибудь такое. У кого есть желание, копайтесь :)

     

    А кто хочет готовое и с пояснениями, где что куда и зачем - все так же ждите.

    • Нравится 1
    • Полезно 1

    Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

    Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

    AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

    Ссылка на комментарий

    Сап, русский форум! :)

     

    Утром было делать нечего, и вспомнил я что меня часто атаковали в ЛС сделать чтобы БТР стрелял не только в актора или сид, но и в группировки и монстров, ну я решил пойти на встречу трудящимся и написал грязный хак от которого меня самого воротит, но до переделки этой схемы мне как до китая в известной позе, поэтому пока пусть будет так, ожидайте когда я доберусь до этой схемы и сделаю ее нормально. 
     
    Пойдет на любую версию игры и любой мод где не менялся ph_car.script.
    Например:

    [ph_car@1]
    ; ...
    target = dolg
    
    [ph_car@2]
    ;...
    target = pseudodog

    Первая настройка стреляет по долговцам, вторая по псевдособакам, несколько группировок указывать пока нельзя, у меня есть много идей по этой схеме, как начну ее тотально переделывать, так и все будет доступно.

     

    Таки запрещено использовать всяким цирковым деятелям, иначе если увижу, буду каждый раз при каждой возможности громко ругаться что украли идею, код, водку, родину и флаг.

     

    Используйте как хотите.

    Скачать ph_car.script


    Еще в качестве ознакомления (так как он работает только у меня) выкладываю обезжиренный _g.script. Версия еще не финальная, но тем не менее на нее уже можно смотреть без отвращения.

    Могу ответить на все интересующие вопросы. Скажу что где-то ~60% кода улетела в помойку, она для релизной версии, да даже для дебага, просто не нужна на мой взгляд. Все функции стараюсь расписывать понятно, по возможности и подробно.

     

    Используйте как хотите.

    Скачать _g.script

    • Полезно 2
    Ссылка на комментарий

    инвентарь Судьбы Зоны

    Почти 40 тыс. строк, охренеть :D

     

    У меня весь апгрейд оружия и брони аля ЗП, вроде не больше 500.

    Ссылка на комментарий

    Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

    Комментарии могут оставлять только зарегистрированные пользователи

    Создать аккаунт

    Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

    Зарегистрировать новый аккаунт

    Войти

    Есть аккаунт? Войти.

    Войти
    • Недавно просматривали   0 пользователей

      Ни один зарегистрированный пользователь не просматривает эту страницу.

    AMK-Team.ru

    ×
    ×
    • Создать...