IKARUS: Обсуждение

kazus23

Гражданин
Регистрация
30 Янв 2011
Сообщения
38
Репутация
11
Адрес
Санкт-Петербург
Не знаю в какой теме можно отписаться, но хотелось бы подробнее узнать о компиляции скриптового пакета Икарус. Икарус добавляет новые функции в игру, и мне допустим нужно собрать просто Gothic.dat и OU.BIN. Скорее всего в проекте будут ошибки, поэтому придеться создавать решение в Соусере. Но при декомпиляции Соусер сам создает некоторые ошибки. Вопрос, не будут ли эти ошибки как-либо влиять и на сам пакет, что для его восстановления потребует прописывать массу строчек скриптов (иногда может быть удален комментарий, а иногда и больше)? Ну и естсественно главный вопрос, поскольку скрипт-пакет создает новые функции и папки в решении проекта, нужно ли что-то знать дополнительное об их исправлении?
 

НастасьСанна

Профессор скриптологии
Регистрация
10 Дек 2012
Сообщения
360
Репутация
442
Адрес
Самара
Re: IKARUS: скрипт-пакет

Я не совсем поняла формулировку вопроса, поэтому просто опишу, как я компилирую скрипты, содержащие Икарус (и ЛеГо).

Во-первых, получить GOTHIC.DAT и OU.BIN с помощью GothicSourcer (GS) больше не получится. Декомпилировать скрипты с Икарусом тоже не получится. Там используется много конструкций, которые GS не понимает и считает ошибками, хотя они реально работают. Компилировать будем Спейсером или самой игрой. Я предпочитаю последнее, т.к. написанный скрипт сразу можно протестировать. GS будем использовать для отлавливания хотя бы части ошибок и просто из-за удобства.:)

Добавляем Икарус в проект
Итак, предположим, что у нас уже есть какие-то скрипты, в которые мы хотим добавить Икарус. Уже есть проект в GS и он не содержит ошибок, нормально компилируется. Назовем этот проект MyProject. Уже есть INI-файл для запуска мода. В общем, есть заготовка, которая без Икаруса работает.

1. GS должен быть закрыт. По крайней мере, должен быть закрыт MyProject.
2. Находим папку, в которой лежат скрипты нашего проекта:
%путь_к_GS%/GothicProjects/SolMyProject/PrjGothic
3. Создаем в PrjGothic папку Ikarus и копируем туда скрипты Икаруса (Ikarus_Const_G2_Rus.d, Ikarus_Rus.d, float_Rus.d, папку EngineClasses_G2_Rus (если не русифицированные, то без _Rus)).
4. Из PrjGothic открываем Gothic.src Блокнотом. Дописываем выделенные строчки, сохраняем и закрываем:
_Intern\Constants.d
_Intern\Classes.d
Ikarus\EngineClasses_G2_Rus\Misk_Rus.d
Ikarus\EngineClasses_G2_Rus\oCAiHuman_Rus.d
Ikarus\EngineClasses_G2_Rus\oCGame_Rus.d
Ikarus\EngineClasses_G2_Rus\oCInfoManager_Rus.d
Ikarus\EngineClasses_G2_Rus\oCItem_Rus.d
Ikarus\EngineClasses_G2_Rus\oCMob_Rus.d
Ikarus\EngineClasses_G2_Rus\oCNpc_Rus.d
Ikarus\EngineClasses_G2_Rus\oCZoneMusic_Rus.d
Ikarus\EngineClasses_G2_Rus\zCCamera_Rus.d
Ikarus\EngineClasses_G2_Rus\zCConsole_Rus.d
Ikarus\EngineClasses_G2_Rus\zCMenu_Rus.d
Ikarus\EngineClasses_G2_Rus\zCMesh_Rus.d
Ikarus\EngineClasses_G2_Rus\zCOption_Rus.d
Ikarus\EngineClasses_G2_Rus\zCParser_Rus.d
Ikarus\EngineClasses_G2_Rus\zCSkyController_Rus.d
Ikarus\EngineClasses_G2_Rus\zCTexture_Rus.d
Ikarus\EngineClasses_G2_Rus\zCTrigger_Rus.d
Ikarus\EngineClasses_G2_Rus\zCWaynet_Rus.d
Ikarus\EngineClasses_G2_Rus\zCWorld_Rus.d
Ikarus\EngineClasses_G2_Rus\zCZoneZFog_Rus.d
Ikarus\Ikarus_Const_G2_Rus.d
Ikarus\Ikarus_Rus.d
Ikarus\float_Rus.d

...
5. Открываем проект в GS. В него уже добавится все, что мы дописали в Gothic.src.
6. Чтобы Икарус работал, его необходимо инициализировать при каждом запуске игры. Для этого в начало файла Startup.d в функции startup_global и init_global необходимо добавить строчку:
MEM_InitAll();

Все, дальше можно делать, что нам нужно.
Но, если попытаться скомпилировать проект, GS этого сделать не сможет. Он выдаст много (у меня 108) ошибок, но процесс компиляции не прервется, он пройдет все скрипты до конца. При использовании функций Икаруса будут появляться и другие "ошибки", но это правило остается. Это позволяет отлавливать критические ошибки до того, как мы запихнем скрипты в игру. Также помогает пункт "Проверка скрипта на ошибки" во всплывающем меню - как только изменили какой-то файл, сразу проверяем его.

Дальнейшие действия можно разбить на 2 части - копирование скриптов из GS в папку Готики и саму компиляцию.

Копирование скриптов
Нам нужно перенести скрипты из папки GS (%путь_к_GS%/GothicProjects/SolMyProject/PrjGothic) в папку Готики (%путь _к_Готике2%\_work\Data\Scripts\Content).

Я использую для этого вот такой BAT-файл:
Код:
@echo off

::путь к Готике и к GS
set pG2="[COLOR="DarkRed"]E:\Gothic Mod\Gothic II Addon\_work\data\Scripts[/COLOR]"
set pGS="[COLOR="DarkRed"]E:\Gothic MOD\GothicSourcer V3.14\Gothic Projects\SolMyProject\PrjGothic[/COLOR]"

::удаляем DMP-файлы
DEL /F /Q %p%..\..\..\..\*.DMP

::копируем скрипты, только обновившиеся и не спрашивая подтверждения на замену
xcopy %pGS%"\_Intern"	%pG2%"\Content\_Intern" 	/d /s /e /y
xcopy %pGS%"\Ikarus"	%pG2%"\Content\Ikarus" 	/d /s /e /y
xcopy %pGS%"\AI"	%pG2%"\Content\AI" 	/d /s /e /y
xcopy %pGS%"\Items"	%pG2%"\Content\Items" 	/d /s /e /y
xcopy %pGS%"\Story"	%pG2%"\Content\Story" 	/d /s /e /y
::копируем SRC
copy %pGS%"\gothic.src"	%pG2%"\Content\gothic.src" /y

pause

При запуске этого файла появится окно командной строки, в котором будут перечислены все скопированные файлы.
Если есть желание, можно, чтобы файл скриптов назывался не GOTIC.DAT (Gothic.src), а, например, MyMod.DAT (MyMod.src).
Тогда пишем
copy %pGS%"\gothic.src" %pG2%"\Content\MyMod.src" /y
А в INI-файле нашего мода указываем
Game=Content\MyMod

Компиляция скриптов
Здесь меня, возможно, поправят, но OU.BIN мне игрой скомпилить не удалось, это я делаю только Спейсером. С другой стороны, пока не меняются реплики персонажей, OU-шник можно и не трогать.

Компиляция игрой (.DAT)
Запускаем GothicStarter для модостроителей. Ставим галочку "Scripte parsen" (компилировать скрипты). Также рекомендую поставить "Festernmodus" (запуск в окне), ползунок "zSpy-Nachrichten" на normal (в серединку), а в поле "Parameter" вписать "-devmode" (включает Марвина).
Запускаем игру кнопкой "Spiel starten". До запуска Готики откроется zSpy. В процессе компиляции там отображается перечень компилируемых файлов. Если возникнет ошибка компиляции, то будем знать, где именно. Иногда в сообщении об ошибке указывается и номер строки в скрипте. Это сообщение тоже добавится в zSpy.
Еще в zSpy удобно выводить отладочную информацию с помощью функции MEM_Debug.
Если все сделали правильно, игра запустится. В начале новой игры или при загрузке сохранений, в zSpy можно найти такую строчку:
01:54 Info: 0 Q: Ikarus log functions now print in colour with prefix 'Q:'.
Это признак того, что Икарус нормально инициализовался, сработала MEM_InitAll().

Компиляция Спейсером (.DAT и OU.BIN)
Запускаем Спейсер кнопкой "Editor starten". Никакой мир открывать не нужно.
Перекомпилировать DAT можно через меню World->Reparse Script..., выбираем наш SRC-файл, который лежит в папке с Готикой. К сожалению, здесь процесс компиляции в zSpy не показывается, только ошибки.
Для компиляции OUшника используем окошко Output-Units. Если оно не отображается, нажмите на панели инструментов левую из двух активных кнопок (Toggles OutputUnits-Window).
Нажимаем кнопку Update - он прогонит OUINFO.INF, появившийся при компиляции скриптов, и выведет список всех фраз в это окошко (довольно долго, но по zSpy можно увидеть, что процесс не завис).
Дальше можно нажать Refresh для удаления дубликатов, хотя не обязательно.
Последним нажимаем Save.

Готовые файлы лежат в _work\Data\Scripts\_compiled\Gothic.DAT и _work\Data\Scripts\Content\Cutscene\OU.BIN. Их нужно будет добавить в MOD-файл. Файлы OUINFO.INF и OU.CSL промежуточные, они в готовом моде не нужны.

Кажется, все. Также рекомендую установить полный gmdk, чтобы при каждом запуске игры не монтировать виртуальную файловую систему. Дело пойдет заметно быстрее. Можно запуск Готики/Спейсера дописать в тот же BATник, тогда вся, кроме OUшника, компиляция будет выполняться запуском этого файла.

Удачи в модострое!
 
Последнее редактирование модератором:

Sonet

Legacy Team
Регистрация
13 Дек 2007
Сообщения
679
Репутация
30
Адрес
г.Минск
Re: IKARUS: скрипт-пакет

Вопрос по спискам: есть ли список всех мобов в игре? можно ли самому создавать списки?
 

НастасьСанна

Профессор скриптологии
Регистрация
10 Дек 2012
Сообщения
360
Репутация
442
Адрес
Самара
Re: IKARUS: скрипт-пакет

Списка MOB'ов отдельно нет. Есть дерево всех VOB'ов MEM_Vobtree(zCTree), из которого можно выцепить MOB'ы с помощью функции Hlp_Is_oCMob.

Если имелись в виду NPC, то оно тоже должны быть в VOBTree и можно попытать MEM_SpawnManager (oCSpawnManager), который содержит список oTSpawnNode, которые содержат ссылки на NPC. Но я не уверена, там все NPC или те, которых нужно заспаунить.

Списки создавать можно, для них даже есть кое-какие готовые скрипты на WOP.de. Проблемы могут быть, если списки нужно записывать в сейвы. Оно вроде бы можно, но нужно копать глубже.

И по поводу наследования классов - Дедалус его принципиально не поддерживает. Можно создать свой класс, в который копипастом запихнуть описание oCNpc + свои поля, но что с ним делать дальше?..

Но если нужно что-то еще сохранить для NPC, неужели AIVAR'ов мало? Их еще можно сильно утрамбовать, если превратить булевы переменные в флаги и запихнуть все в 1-2 aivar'а.
 

Sonet

Legacy Team
Регистрация
13 Дек 2007
Сообщения
679
Репутация
30
Адрес
г.Минск
Re: IKARUS: скрипт-пакет

Списка MOB'ов отдельно нет. Есть дерево всех VOB'ов MEM_Vobtree(zCTree), из которого можно выцепить MOB'ы с помощью функции Hlp_Is_oCMob.

Если имелись в виду NPC, то оно тоже должны быть в VOBTree и можно попытать MEM_SpawnManager (oCSpawnManager), который содержит список oTSpawnNode, которые содержат ссылки на NPC. Но я не уверена, там все NPC или те, которых нужно заспаунить.

Списки создавать можно, для них даже есть кое-какие готовые скрипты на WOP.de. Проблемы могут быть, если списки нужно записывать в сейвы. Оно вроде бы можно, но нужно копать глубже.

И по поводу наследования классов - Дедалус его принципиально не поддерживает. Можно создать свой класс, в который копипастом запихнуть описание oCNpc + свои поля, но что с ним делать дальше?..

Но если нужно что-то еще сохранить для NPC, неужели AIVAR'ов мало? Их еще можно сильно утрамбовать, если превратить булевы переменные в флаги и запихнуть все в 1-2 aivar'а.
Да, имел в виду монстров (в Уроке 1 говорится, что есть список всех НПЦ). В принципе все логично, игра про новые списки и ноыве структуры то ничего не знает.

Про AIVAR'ы честно говоря не знаю или не помню. Но суть ясна, спасибо.
 
Последнее редактирование модератором:

Saturas

Новичок
Регистрация
29 Дек 2011
Сообщения
9
Репутация
0
Re: IKARUS: скрипт-пакет

PHP:
            int voblist;            //zCListSort<zCVob>*
            int voblist_npcs;       //zCListSort<oCNpc>*
            int voblist_items;      //zCListSort<oCItem>*
Это к слову о спике, вобов, нпс и предметов, они есть как в карусе так и в ексте, и лично я ими очень активно пользуюсь, так что не думаю что разумно потрошить zCTree на наличие нпс, хотябы по той причине что эти 3 списка уже есть.
 
Последнее редактирование модератором:

Neromont

Новичок
Регистрация
5 Дек 2012
Сообщения
7
Репутация
3
Адрес
Магнитогорск
1. Такое огромное количество функций в Ikarus, и что их все можно использовать начиная от MEM_CheckVersion?

2. Я так понял Ikarus работает напрямую с движком?
 
Последнее редактирование модератором:

Neromont

Новичок
Регистрация
5 Дек 2012
Сообщения
7
Репутация
3
Адрес
Магнитогорск
Все можешь использовать.
С движком работает косвенно, но по сути да.

Я тут просмотрел LEGO http://lego.worldofplayers.de/?, я так понял его разрабатывали те же самые люди, что трудились над Ikarus. Я не понял LEGO идет как дополнение к Ikarus или как отдельный продукт.
 

НастасьСанна

Профессор скриптологии
Регистрация
10 Дек 2012
Сообщения
360
Репутация
442
Адрес
Самара
Я тут просмотрел LEGO http://lego.worldofplayers.de/?, я так понял его разрабатывали те же самые люди, что трудились над Ikarus. Я не понял LEGO идет как дополнение к Ikarus или как отдельный продукт.

LeGo - это отдельный пакет, основанный на возможностях Ikarus, т.е. для LeGo нужен Ikarus, но Ikarus можно использовать и отдельно.

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

LeGo можно рассматривать как коллекцию решений прикладных задач с помощью Ikarus. Например: диалог с несколькими NPC, зацикленные функции без триггера, навешивание хуков на функции, вывод изображений и текста на экран и др.

И, да, Ikarus разрабатывал Sektenspinner, а LeGo - детище Lehona и Gottfried.
 

Neromont

Новичок
Регистрация
5 Дек 2012
Сообщения
7
Репутация
3
Адрес
Магнитогорск
Спасибо. Напишу так, не нашел кнопку "Спасибо". Значит необходимо сначала подключить Ikarus, а после этого LeGo.

С авторами точно ошибся. Я за целый день уже начитался столько всего, что не удивительно :).
 
Последнее редактирование модератором:

Neromont

Новичок
Регистрация
5 Дек 2012
Сообщения
7
Репутация
3
Адрес
Магнитогорск
Если LeGo основан на Ikarus значит его можно компилировать с помощью Gothic Sourcer 3.15?
 

redleha

Administrator
Команда форума
Регистрация
28 Фев 2008
Сообщения
1,487
Репутация
426
Адрес
г.Новокуйбышевск Самарская обл.
Сверху Снизу