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

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


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

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

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

Изменено пользователем 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
Ссылка на комментарий

 

 

Пруф?

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

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

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

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); 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 ядер, 32 потока, 5.75 ГГц); 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
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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