KD87

Universal ACDC и другие perl-скрипты

1 553 сообщения в этой теме

 

Как некоторым, может быть, известно, на X-Ray Engine Toolset идет развитие утилит, доставшихся нам вместе с исходниками от выдающихся программистов коммьюнити (прежде всего, конечно, bardak'a). В силу своих скудных навыков по программированию я занимаюсь прежде всего perl-скриптами - ACDC, game.graph recompiler и т.д. В этой теме я прошу тех мододелов, кто часто работает с perl-скриптами, помочь с отловом багов. Прежде всего интересует Universal ACDC - спавны каких модов не распаковывает, какие фичи не работают, все, что найдете. Здравые мысли по развитию скриптов также приветствуются. Надеюсь на вашу помощь.

 

-----------------------------------------------------------
--S.T.A.L.K.E.R. *.spawn compiler/decompiler--
-----------------------------------------------------------
Версия: 1.38
Дата последних правок: 21.05.2014

 

Данный acdc предназначен для распаковки и запаковки all.spawn/level.spawn от любого билда, начиная с 1265.
Основные фичи:
-распаковка оригинальных спавнов ТЧ, ЧН, ЗП и билдов ТЧ, начиная с xrCore build 1265.
-распаковка спавнов от модов (требуется папка конфигов от мода)
-конвертация спавна в любую другую версию.
-массовая замена гейм-вертексов в распакованном спавне.
-разбивка all.spawn на level.spawn'ы и level.game'ы
-сравнение файлов распакованного спавна
-обновление вертексов согласно координат объектов
Что нужно для работы:
-собственно, сам спавн (all.spawn, level.spawn)
-game.graph (только если распаковываете all.spawn).
Если all.spawn от билда 3120, ЧН или ЗП - game.graph не нужен (он вшит в спавн).
-папка configs (если распаковываете мод и acdc жалуется на unknown section)

Для корректной работы используйте с папкой stkutils строго последней версии.

Использование:
Кладете all.spawn (или level.spawn) и game.graph в папку с программой, делаете батник (команды ниже),
запускаете батник, радуетесь жизни.

Пояснение по дальнейшему тексту: в угловых скобочках (<>) указано значение опции. Это путь до спавна,
папка для распаковки и т.п., то есть то, что нужно вписывать вам. В квадратных скобочках ([])
указаны необязательные опции. Опции без скобочек - обязательны.

 

Режим предназначен для распаковки файлов all.spawn и level.spawn



Команда: universal_acdc.pl -d <spawn_file> [common_options]

 

-d <spawn_file> - путь до спавна.
common_options - общие опции. Читайте про них ниже.
При распаковке спавнов от модов может возникнуть ошибка "unknown section".
Это означает, что в моде используются нестандартные секции предметов/мобов.
Для распаковки такого спавна необходимо использовать ключ -scan, указав ему в качестве параметра
путь до папки config/configs. Пример смотрите в батнике acdc_decompile_scan.

 

Режим предназначен для запаковки распакованных текстовых файлов спавна в all.spawn или level.spawn



Команда: universal_acdc.pl -compile <dir> [-idx <index_file>] [-f <flag1,flag2,...>] [common_options]

 

-compile <dir> - папка, в которой лежит распакованный спавн. Если работаете в текущей папке, <dir> не нужно.
common_options - общие опции. Читайте про них ниже.
-idx <index_file> - с этим ключом скрипт сформирует ltx конфиг с секциями вида:

[13_box_wood_01_0021] ;формат - "индекс_локации"_"имя_объекта"
id = 2907 ;id объекта
story_id = -1 ;story_id объекта

Такие записи создадутся для ВСЕХ объектов из спавна.
Если указать ключ -idx без пути до конфига, он появится в папке с acdc (spawn_ids).
Зачем это нужно? В игре вы сможете открыть этот файл из скриптов и найти нужный вам объект.
Если раньше для нахождения нужного id объекта по имени требовалось перебрать все объекты в игре,
теперь это можно сделать, просто считав id из нужной секции конфига.
Также есть кое-какие дополнительные фичи:
- при компиляции для правильной работы необязательно проставлять всем секциям в спавне
параметры version и script_version. Достаточно поставить их в секции актора, ацдц далее будет использовать их.
Полезно, когда спавн "сборный".
- при компиляции контролируется уникальность параметров story_id, чтобы не мучиться потом с вылетами игры.

 

Режим позволяет конвертировать спавны ТЧ, ЧН, ЗП между собой.



Команда: universal_acdc.pl -convert <file> -version <new_version> [common_options]

 

-convert <file> - файл, который нужно сконвертировать. Можно указывать как запакованный (*.spawn) спавн,
так и распакованный (alife_***.ltx). Внимание! Так как граф и кросс-таблицы в ЧН и ЗП вшиты в спавн,
для конвертирования ЗАПАКОВАННЫХ спавнов ТЧ в эти форматы вам потребуется положить в папку с acdc
папку levels из игры. Необязательно копировать все файлы, достаточно оставить в папке с каждой локацией
файл level.gct.

-version <new_version> - новая версия спавна. Подобрать версию вы сможете, посмотрев файл spawn_versions.txt
common_options - общие опции. Читайте про них ниже.

Также поддерживается тонкая настройка конвертации через файл convert.ini.
В файле есть две секции: [exclude] и [change]. В секции exclude можно прописать те секции,
которые надо удалить из спавна при конвертации. Пример:

[exclude]
sections = m_trader, m_car, flesh_weak

В секции change прописываются имена тех секций, в которых нужно что-то поменять или дополнить.
Пример:

[change]
sections = inventory_box

Далее заполняете файл записями для тех секций, которые вы прописали в change. Пример:

[inventory_box] //section_name нужной секции
add:custom_data = PREVED //префикс add используется для тех параметров, в которые нужно добавить
add:game_vertex_id = 10000 //необходимое значение (если число - складывается, если строка - добавляется в конец)
rep:level_vertex_id = 0 //префикс rep используется для параметров, которые необходимо заменить на что-то

Общий пример. Следующий конфиг приведет к тому, что у всех сталкеров прибавится 500 к гейм-вертексу и
визуал сменится на визуал вояки в противогазе:

[exclude]

[change]
sections = stalker

[stalker]
add:game_vertex_id = 500
rep:visual_name = actors/soldier/soldier_antigas.ogf

 

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



Команда: acdc -parse <file> -old <old_gvid0> -new <new_gvid0> [-way] [common_options]

 

-parse <file> - имя ltx, в котором находится спавн.
-old <old_gvid0> - старый начальный game_vertex_id локации.
-new <new_gvid0> - новый начальный game_vertex_id локации.
-way - обрабатывает также файл way_***.ltx для этой же локации.

Пример: acdc -parse alife_l01_escape.ltx -old 0 -new 934

 

Разбивка all.spawn на level.spawn может быть полезна при одновременной правке спавна в СДК и с помощью ACDC.



Команда: acdc -split <file> [-use_graph] [-way] [common_options]

 

-split <file> - разбиваемый спавн. Для восстановления граф-поинтов необходимы level.spawn для всех локаций,
находящихся в графе. Их следует поместить в папку levels согласно их положению в геймдате сталкера - по папкам,
соответствующим локациям. Папка levels должна быть в папке с acdc (или путь до нее можно задать ключом - читайте далее).
-use_graph - использование game.graph для восстановления граф-поинтов. Плюс - не нужны level.spawn, минус -
не восстанавливаются имена граф-поинтов (за исключением граф-поинтов переходов).
-way - также из спавна генерируются level.game

 

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



Команда:  acdc -compare <file1,file2> [common_options]

 

-compare <file1,file2> - файлы для сравнения

 

Зачем нужно: при изменении аи-сетки у объектов изменяются game_vertex_id и level_vertex_id.
Это влечет за собой необходимость повторного снятия данных параметров в игре. Данный режим
позволяет автоматически обновить вертексы у всех секций спавна.



Команда: universal_acdc -update <spawn_name> [common_options]

 

-update <spawn_name> - all.spawn, для которого надо обновить вертексы.

Режим update требует дополнительной настройки. В папке с acdc есть файл fs_vertex.ltx
В этот файл необходимо вписать путь до локаций с ОБНОВЛЕННОЙ аи-сеткой. Обязательно
должны присутствовать файлы level.ai, level.gct для всех локаций из спавна.
ВНИМАНИЕ! Для нормальной отработки режима геймграф должен быть СТАРЫЙ, использовавшийся
до перекомпиляции. После нормальной отработки режима спавн можно распаковывать уже с НОВЫМ геймграфом.

 

-out <file> - путь до файла/папки с результатом. Имеет разный смысл для разных опций:
для decompile, parse - папка с результатом
для compile, convert - результрующий файл.
для split - папка levels, куда сохранять level.spawn.

-scan <scan_dir> - путь до папки с конфигами. Используется в случае спавнов от модов.
-g <graph_dir> - путь до папки с game.graph. Бесполезен для compile и parse, а также, если работаете со спавном ЧН, ЗП, build 3120.
-level - обрабатывать спавн как level.spawn.
-af - также распаковываются\запаковываются места спавна артефактов в аномалиях (section2.bin).
-nofatal - отключает вылет при фатальной ошибке, заменяя ее предупреждением.

 

Если acdc генерирует ошибку 'unknown clsid ... for section...', это означает, что в данном моде добавлены новые пары клиентский/серверный класс в class_registrator.script.


Дабы не усложнять работу с acdc, такие пары не определяются автоматически.
Лучше всего сообщить об этом мне, однако, если вы понимаете, что находится внутри class_registrator.script, можете добавить новые сеты в clsids.ini сами. Сеты добавляются в таком формате:

clsid = соответствующий_серверный_класс

Пример:
ZS_ELECT = se_zone_anom
=================================
Любые имена опций можно сокращать. К примеру, необязательно использовать именно -use_graph, скрипт поймет также и -use, и -u.
Однако ряд опций при сокращении их имени могут конфликтовать друг с другом. -compile нельзя сократить до -c, поскольку
в таком случае скрипту неясно, что имеется ввиду: -compile или -convert. В таком случае наиболее короткое имя для compile
будет таким: -com

 

1.38:
[!] добавлена поддержка релизного спавна Lost Alpha
[!] исправлена конвертация и конвертация
1.37:
[+] добавлена распаковка и запаковка спавна билда Lost Alpha
[!] все не распознанные пути при сплите теперь сваливаются в unrecognized_ways.game
1.36:
[!] исправлена разбивка спавна на level.spawn и level.game
[!] исправлено сканирование конфигов
1.35:
[!] исправлено автоназначение версии при отсутствии этого параметра в секции
[!] убрано чтение game.graph при компиляции
1.34:
[!] исправлено обновление вертексов
[+] добавлено обновление параметра distance при обновлении вертексов
[+] добавлен контроль уникальности story_id при компиляции
1.33:
[!] исправлена распаковка спавнов некоторых билдов
[+] добавлен режим обновления вертексов
[+] добавлен "умный" разбор way-объектов по локациям для режима split
1.322:
[+] добавлено сравнение распакованных файлов
1.321:
[!] исправлена распаковка спавнов ЗП
1.32:
[!] guids.ltx больше не нужен без ключа -idx
[+] реализована сортировка way-объектов по алфавиту
[+] реализовано определение принадлежности way-секции к локации по gvid и префиксу
[+] реализована сортировка alife-объектов
1.31:
[!] изменен алгоритм сканирования конфигов
[!] изменен приоритет запросов из clsids.ini, теперь данные из него перекрывают внутренние таблицы
[!] скрипт адаптирован под новую систему отладочных сообщений
[f] поправлена логика работы с пакетом актора в ЧН
[+] добавлена возможность вынесения лога в файл
[+] добавлена возможность вынесения сетов в отдельный конфиг-файл
1.30:
[f] теперь новая версия обработчика ошибок по-прежнему обрабатывает спавн Народной солянки
[f] исправлены проблемы распаковки level.spawn некоторых билдов
1.29:
[f] исправлена ошибка распаковки level.spawn билдов
[f] исправлена ошибка распаковки спавна ЧН
[f] всякие мелкие правки
1.28:
[f] исправлено игнорирование парсером ключа -way в режиме split.
[f] исправлена ошибка сканирования конфигов при компиляции.
[f] исправлена ошибка чтения секций некоторых se-классов.
[f] исправлена ошибка разбивки спавна, из-за которой генерировались левел спавны неправильного формата.
[+] добавлен контроль дубликатов актора при компиляции.

1.27:
[f] исправлена ошибка парсера, в некоторых случаях приводившая к порче логики.
[f] исправлено создание папок при сохранении результата.
[+] добавлена переинициализация параметров секции после смены класса при конвертации. Это расширяет диапазон
версий, доступных для конвертирования.
[+] добавлена поддержка масок при конвертации.
[+] добавлен ключ -ini в режиме конвертации

1.26:
[f] поправлена распаковка спавнов ЧН.
[+] добавлено автоматическое заполнение версии спавна из первой секции (если актора в спавне нет).
[+] что-то еще по мелочи, не помню.

1.25:
[f] отключен вывод пустого параметра spawned_obj при распаковке.
[+] реализовано автоматическое заполнение параметров version и script_version
при запаковке спавнов с секциями из разных версий игры. Версия берется из конфига актора.

1.24:
[f] исправлена распаковка/запаковка спавна билда 2571.
[f] исправлена запись guids.ltx
[f] мелкие правки

1.23b:
[+] убрано предупреждение "state data left" при распаковке спавнов ЗП, запакованных
ранее с помощью acdccop.
[f] исправлены ошибки split, из-за которых могли получаться кривые level.spawn
[f] переделана логика чтения/записи пакетов se_stalker/se_monster
[f] мелкие изменения

1.22b:
[+] добавлен ключ -nofatal

1.21b:
[f] исправлены небольшие опечатки в коде.
[f] парсер теперь корректно читает значения с комментариями.

1.2b:
[f] небольшие правки по конвертации.
[+] добавленные в модах соответствия clsid -> серверный класс теперь редактируются
в отдельном конфиге (clsids.ini).
[+] ошибка при встрече незнакомого clsid теперь выдается при распаковки секции
спавна с таким clsid, а не при сканировании конфигов, как раньше.

1.1b:
[+] проверена распаковка билд-спавнов, решена проблема декомпиляции спавнов
билдов 25хх.
[+] добавлен контроль наличия параметра version в секциях распакованного спавна.
[f] исправлено исключение файла со spawn_id объектов при сканировании конфигов.

1.0b:
[+] основательно переработан код, часть скрипта вынесена в отдельные модули.
[f] исправлены все не работавшие функции.
[+] увеличена скорость выполнения кода, уменьшены требования по памяти.

 

ACDC для ТЧ - bardak, для ЗП - bardak, @Kolmogor. Все остальное - @KD87
Используйте/выкладывайте где и как хотите, с указанием авторов.

Новичкам в редактировании спавна поможет краткая инструкция:

 

Чтобы не плодить сторонних папок и все было под рукой для работы и игры - будем работать прямо в рабочей папке с игрой/модом.
Устанавливаем и настраиваем комплект ACDC:

1. Открываем папку 'gamedata\spawns' и в ней создаем папку 'acdc'.

2. В эту папку (acdc) копируем (распаковываем) весь комплект файлов из архива 'Universal ACDC.7z', т.е. в папке должны лежать:
- universal_acdc.pl - перл-скрипт утилиты;
- acdc_decompile.bat - командный файл для распаковки;
- acdc_compile.bat - командный файл для запаковки;
- stkutils - папка со служебными библиотеками утилиты;
... - необязательные или технологические файлы (universal_acdc_readme.txt и т.п.).

4. Выходим опять в папку 'gamedata\spawns' и создаем в ней папку 'unpack' - в этой папке будут находиться файлы распакованного спавна.

5. Открываем командный файл (батник) 'acdc_decompile.bat' и изменяем в нем строку на эту:


universal_acdc.pl -d ../all.spawn -o ../unpack -g ../../ -scan ../../config/

 

6. Открываем командный файл (батник) 'acdc_compile.bat' и изменяем в нем строку на эту:


universal_acdc.pl -c ../unpack -o ../all.spawn

 

7. Проверьте, есть ли в папке 'gamedata' файл 'game.graph'.
Если его нет - распакуйте его из пак-файлов (gamedata.db*) оригинальной игры и скопируйте в папку 'gamedata' мода.

8. Важно! Для вашей безопасности скопируйте файл 'all.spawn' в удобное вам место (зарезервируйте) для возможности восстановления исходного файла спавна после возможных ваших ошибок при редактировании.

Все, ваш комплект готов для работы с 'all/spawn'-ом на лету, т.е. вы можете запускать игру и играть, можете распаковывать, редактировать и запаковывать файл спавна.
- Распаковка - запускаете 'acdc_decompile.bat' (см. по пути '\gamedata\spawns\acdc');
- Редактируете в папке 'unpack' (см. по пути '\gamedata\spawns\unpack');
- Запаковка - запускаете 'acdc_compile.bat' (см. по пути '\gamedata\spawns\acdc');
- ... проверяете в игре.

Примечание: Если у вас стоит ОС Windows 7 - возможно потребуется в начало командных строк добавить вызов 'perl':


perl universal_acdc.pl -d ../all.spawn -o ../unpack -g ../../ -scan ../../config/
perl universal_acdc.pl -c ../unpack -o ../all.spawn

 

Успехов в модмейкерстве! :-)

 

Для удобства выкладываю ссылку на ACDC отдельно (папка stkutils - ставить обязательно!)
Версия 1.38
Для работы необходим Active Perl (брать с официального сайта)

 
 

- LA (билд)
- АМК v.1.4.1
- Z.E.N.O.B.I.A.N mod
- NLC 2-6
- SIMBION
- OGSM v.2.3.1 Final
- Народная солянка 2010 от 19.04 (с ключом -nofatal)
- R.M.A. v.1.1
- Oblivion_Lost
- SRP
- Тайные тропы 2
- Lost World - Requital
- Lost World - Trops of Doom

 

- OGSM v.1.7 (для распаковки исправьте в w_vintorez.ltx class = WP_VINT на class = WP_AK74 либо используйте ключ -nofatal)
- Difficult Zone Mod v.1.0 (аналогично OGSM)
- SolinX v.1.1.3
- SolinX v.2.0 (без сканирования)
- Full Realism Mod v.1.0
- Shoker Mod v.1.2 (без сканирования)

 

- SGM v.1.7
- SGM v.2.0
- Slayer mod beta 0.17
- ARS v.0.5.2 (без сканирования)
- AMK ЗП v.0.4

Priboi Story не распаковывается из-за xrSpawner. Кому надо, вот распакованный спавн.
Постите результаты распаковки спавнов, полученные вами.

Внимание! Для повторного сканирования конфигов необходимо удалить файл sections.ini. Или воспользоваться батником acdc_decompile_scan (распаковка).

 

Собрал большинство перл-скриптов в кучу и адаптировал их под единую библиотеку модулей stkutils. Написал пару новых скриптов. Итак:

 

gamemtl.xr (поддерживается полная распаковка)
lanims.xr (поддерживается полная распаковка)
particles.xr (поддерживается только распаковка на бинарные файлы)
shaders.xr (поддерживается полная распаковка)
shaders_xrlc.xr (поддерживается полная распаковка)
senvironment.xr (поддерживается полная распаковка)

 

Распаковщик спавнов universal acdc 1.35
Распаковщик сохранений save unpacker 0.4

 

Сборщик/разборщик файлов RIFF-формата: chunk parser
Скрипт для массовой замены строк файлах формата ini сталкера: data repclacement ini
Скрипт для массовой замены строк в произвольных текстовых файлах: data repclacement text
Скрипт для изменения высоты травы: details height changer
Скрипт для копирования ресурсов разрабатываемой локации из СДК: resource copier

 

Распакованную библиотеку модулей (папка stkutils) нужно положить в папку со скриптом или (советую) в C:\Perl\lib (или аналогичную папку, если вы установили ActivePerl в другую папку). Во втором случае stkutils будет работать для всех скриптов сразу независимо от расположения.

 


Изменено пользователем Eugen81
Правка после переезда.

  • http://www.amk-team.ru/forum/uploads//ratings/bf.gif × 4
  • http://www.amk-team.ru/forum/uploads//ratings/thumb_up.png × 1
  • http://www.amk-team.ru/forum/uploads//ratings/wrench_orange.png × 6

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

KD87, Universal ACDC не распаковывает аллспавн солянки.

FATAL ERROR!

Function: alife_object::read_common

Line: 5233

Expression: defined $class_name

Description: unknown class for section stalker_sniper

 

 

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

dragunof, распаковывает. Для спавнов от модов acdc необходимо запускать с ключом -scan [путь до папки с конфигами], предварительно удалив sections.ini от предыдущих запусков. В ридми это не разжевано, моя оплошность.

Пример батника (положите папку config от мода в папку с acdc):

universal_acdc.pl -d all.spawn -scan config\

pause

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спавн от бета-версии LW:ToD распаковывает.

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

У меня не получилось, выбило, что не может найти файл локации. Хотя путь до all.ltx указан.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах
Real Wolf, в прошлой версии никак. В текущей версии доступно: http://narod.ru/disk/25416706001/Universal%20ACDC.rar.html. Компилировать с ключом -с, только вместо all.ltx указывать путь до папки с распакованным спавном. Если спавн в текущей папке - просто указать ключ -с.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Предложение:

С целью использования возможности работы с оригинальным файлом 'game.graph', а не с его копией, добавить опцию для возможности указания пути до этого файла, т.е. типа:

 

[-g graph_dir]

 

-g <graph_dir> - путь до game.graph. Если не задан или пуст, граф распаковывается из корневой папки утилиты.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Artos, сделано: http://narod.ru/disk/25432988001/Universal%20ACDC.7z.html. Поддерживаются переходы на верхние уровни каталога (../), то есть можно обойтись без абсолютного пути. В архиве есть примерный батник.

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

KD87

Чтобы не вызывать волну 'фантазий', нельзя ли 'огласить весь список' возможных направлений именно для ACDC в плане пожеланий к функциональности? :-) Т.е. имею ввиду, каковы пределы фантазий? Ведь для упаковщика/распаковщика основное именно получить распакованные коды в стандартном и удобно читаемом виде и упаковать строго в соответствии с форматом игры.

Каковы основные направления усовершенствований утилиты привлекающие внимание разработчика и приветствуются им? И каковы явно нежелательные? Например, пожелание совместить утилиту с неким подобием чекера конфигов с выдачей списка ошибок (а не прерывания по первой ошибке) - это ненужная рутина или ...?

 

Сортировка секций?

Учитывая то, что в игре имеется и в модах используется метод спавна объекта именно по индексу секции из 'all.spawn'-а ( alife():create(number) ), то ... пересортировка 'по вкусу' может запутать применение этого метода.

Попробую сформулировать:

Учитывая, что имеется метод спавна по индексу секции из all.spawn'а, в кодах скриптов заносятся численные значения этих индексов.

При добавлении/удалении секций в all.spawn, значения индексов после упаковки изменяются, что требует синхронизации новых значений из all.spawn'а со значениями из скриптов. При более чем десяток-два таких значений, ручная операция довольно утомительна и чревата ошибками по невнимательности/забывчивости.

Вопрос: возможно ли к ACDC подключить некий исходный файл-список с индексами секций (используемыми в скриптах), которые должны контролироваться. И, после перекомпиляции, получать список соответствий исходных индексов контролируемых секций (до упаковки измененного кол-ва всех секций) с индексами этих секций после (пере)упаковки?

 

Добавлено через 16 мин.:

P.S. 'Список контролируемых секций' - вероятно не самое удобное решение. Может быть модмекером может ставиться некий признак в секции all.spawn'а интересующего его объекта (некий аналог story_id), а упаковщик на выходе давал бы информацию о прежнем индексе секции (не обязательно) и новом индексе для данного конкретного признака.

Изменено пользователем Artos

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

А нельзя так: "Пусть папки будут всегда распакованы, а компилятор автоматически следит за порядком в номерах секций если в папках, что-либо изменяется." Это и будет "высшая форма существования ACDC".

Изменено пользователем 7.9

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

7.9

Сорри, но о каких папках ты говоришь и о каком автомате?

Номера секций - автоматически даются исходя из непрерывного последовательного ряда. Этот ряд делится на поддиапазоны по локациям. Любое внесение секции объекта на какую-либо локацию влечет сдвиг всех последующих секций с их индексами.

 

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я пока all.spawn не использовал, но, видимо, "близится тот час". Хотелось бы работать с этим файлом как с обычными конфигами и не заботиться о том, что там что-то постоянно куда-то "уезжает".

Про папки я оговорился - файлы.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

7.9

Можешь работать с all.spawn'ом как с обычными конфиг-файлами, соблюдая правила, только а) необходимо для "удобства чтения и правок" распаковать и запаковать его, если внес правки, и б) не использовать в своих скриптах метод, зависимый от плавающих индексов. :-)

Изменено пользователем Artos

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

7.9, сейчас так - поправил конфиг-спавны, запустил компиляцию и вуаля - сгенерирован новый спавн файл. Можно, конечно, сделать, чтобы acdc все время в памяти висел - но это уже все-таки лишнее.

Artos, что касается индексов. Нет, в общем случае "залоченных" индексов сделать нельзя. Просто потому, что движок при чтении спавна читает секции строго подряд, наращивая индекс на единицу. Поэтому в спавне не должно быть пробелов в индексах, в противном случае полспавна просто не заспавнится. Во избежание этого acdc при импорте секций на всякий случай переназначает все индексы - мало ли какие там провалы в индексах после правок модмейкером. Но подумать на эту тему можно, я понимаю суть проблемы скриптера. Пока могу сделать предложенный тобой второй вариант - вывод индексов секций (в лог-файл, например), помеченных метками. Скажем, для секции, записанной вот так - [4562]:log - будет выведен старый и новый индекс после запаковки в лог-файл. Так устроит?

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

Фантазию не ограничиваю никак. Утилита ведь нужна прежде всего вам, мододелам, вот и пишите, чего не хватает. Конечно, не стоит ждать от perl-скрипта второй LE, а так реализовать можно почти любую разумную вещь.

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

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

KD87

Я ни коем разе не имел ввиду "залоченные" (неизменные) индексы, это было бы слишком хорошо, но увы врядли возможно.

Вывод в лог-файл типа [4562]:log -> OLD - NEW - уже подспорье, но частичное.

Морока модмейкеров, кто имеет такие необходимости по синхронизации индесков вот в чем:

1. Имеем, например десяток переходов (level_changer) и/или рестрикторов и/или квестовых персов.

2. При начале игры - переходы удаляем, чтобы были закрыты, рестрикторы тоже в процессе игры удаляем, чтобы не мешали, растранжиривая логикой ресурсы. Квестовые персы порой погибают.

3. Нужно открыть переход - спавним по секции, нужно включить (опять) рестриктор - спавним по секции, нужно оживить мертвого перса - удаляем и спавним по секции.

ВО всех этих опервациях важен именно индекс секции из текущеко алл.спавна. Стоит в начало алл.спавна иль еще куда вставить новый объект - все (или даже часть) используемых в скриптах индексов поплыли ...

Вариант с [4562]:log -> OLD - NEW - уже подспорье, не нужно лазить по всем ltx в поискаи по имени иль еще какому признаку нужной секции и считывания его индекса. Но имея только набор соответствий и не имея дополнительных (еще лучше эксклюзивных)признаков (имя, story_id, ...) - также просто и ошибиться.

Может быть кто-то еще, иль я попозже, даст нечто более удобное, но на сейчас:

если в секцию добавлять что-то типа параметра 'fix_index=my_name_1' и в лог выводить: my_name_1: OLD_IDX => NEW_IDX

тогда задавая удобные 'my_name_1' модмейкеру гораздо проще контролировать и синхронизировать. Даже 'OLD_IDX' уже становится не особенно нужным (может для перепроверок).

 

Кто-то может возразить: "А зачем? Ведь можно и скриптами все это делать."

Да, и воскрешение персов скрптами уже не проблема, и спавн любых переходов в нужное время (по крайней мере я уже сделал) и рестрикторы не так уж и много жрут ... Но и немало нюансов (с теми же персами) да и неискушенным скриптерам попроще.

Изменено пользователем Artos

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах
движок при чтении спавна читает секции строго подряд, наращивая индекс на единицу

Вот и отлично - 2000 (зарезервированных) секций на локацию (в оригинале - в среднем не более 1000) и будет у нас "стабилизированный all.spawn". Локации заполнять последовательно, можно даже завести, что-нибудь в роде реестра для этого файла...

Ладно - вам виднее :)

Изменено пользователем 7.9

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

7.9, ты бы все же вначале поработал бы немного с алл.спавном, дабы понять особенности и суть.

Ты предлагаешь на каждую локацию в обязательном порядке спавнить 2000 объектов? И, если нужных объектов не так много - спавнить некие пустышки? Тем самым "застабилизировав" индексы. И новые добавлять заместо пустышек? ;-)

Не забывая - каждый объект это игровой ID, а их в игре всего 65535.

Изменено пользователем Artos

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Artos, это я все понимаю. А зачем такая морока: 'fix_index=my_name_1'? Я вполне могу вывести в лог name или section_name из этой секции. В логе будет что-то типа того:

[stalker_wolf]
old_index = 456
new_index = 472.

Или только новый индекс, или в любом другом форматировании, можно добавить story_id, мне это без разницы, на ваше усмотрение.

7.9, тут не зарезервируешь, для движка все секции должны быть заполнены. Не заставишь же мододелов делать строго по 2000 объектов на локации.

Так графическая оболочка для ACDC интересна или нет?

Изменено пользователем KD87

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тогда... так:

ВО всех этих операциях важен именно индекс секции из текущеко алл.спавна

В нужные секции добавить специальный параметр, экспортировать копии файлов из папки spawns в конфиги, присоединить к system.ltx, и читать их...

Изменено пользователем 7.9

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

KD87, последний (17.09.2011) вариант ACDC работает отлично! Спасибо!

Все для всех параметров пути к файлам/папкам можно задавать относительными и все работает без сбоев.

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

7.9, ты все-таки не совсем понимаешь проблему :) Для движка никакой проблемы нет - проблема у скриптеров (причем только у тех, кто часто спавнит предметы по id), даже не столько проблема, сколько неудобство. Сошлись на том, что в помощь скриптеру будет выводится инфо-файл с этими индексами, исключительно в целях удобства.

Artos, относительные пути и раньше поддерживались, просто не очевидно и никем нигде не указывалось. FEEL TEH POWER OF IO::FILE! :)

Поделиться этим сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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


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

Войти

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


Войти

  • Пользователи, читающие эту тему   0 пользователей

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