Пишем инсталлятор аддонов
Для начала пару слов, для чего это, собственно, нужно. Обычно моды распространяют в архивах, это общепринятый способ, который, к сожалению, не лишен недостатков, основные из которых:
- для распаковки нужно знать, куда распаковывать (если с обычными модами достаточно найти папку Downloads и распаковать в нее, то с глобальными модами или хаками такой способ не всегда проходит, к тому же при перекрытии объектов они начинают обозначаться как модифицированные («звездочкой») в игре и бодишопе);
- для распаковки нужен архиватор, конечно, не очень сильный аргумент в стране, где софт делится на лицензионный и весь остальной, но все же;
- архив распаковывается целиком, т.е. как правило, невозможно выбрать, что конкретно устанавливается.
Нам понадобится NSIS и блокнот (или что-нибудь посовременнее, типа Notepad++. Почему выбран NSIS? Потому, что он гибкий, с широкими скриптовыми возможностями и высокоэффективным архиватором, и наконец, просто мне нравится.
Любой инсталляционный пакет состоит из данных (файлов) которые будут куда-нибудь установлены и установочного скрипта (сценария установки). Блокнот или любой текстовый редактор нам понадобится, потому что скрипт пишется вручную. К счастью NSIS поддерживает включаемые файлы и, поэтому, весь скрипт нам писать не придется.
Итак начнем:
1. Скачайте и установите NSIS;
2. Скачайте заголовочные файлы;
3. Создайте папку в которой будет размещаться ваш проект и распакуйте файлы в нее, всего 4 файла и папка с примером:
- setup.nsi – заготовка для сценария установки, в этом файле мы будем писать скрипт;
- ar_sims.nsh – заголовочный файл с базовым скриптом инсталлятора, его трогать не нужно;
- ar_sims_consts.nsh – заголовочный файл с константами;
- list.txt – файл со списком аддонов в пакете (типа readme), файл должен называться list, но может иметь любое расширение;
4. Откройте в редакторе файл ar_sims_consts.nsh:
Теперь отредактируйте значения AR_NAME, AR_INST_NAME и AR_INST_VER.
Внимание! Значение AR_NAME должно быть уникальным и не содержать пробелов – это значение используется как часть имен инсталлятора и ветки в реестре.
5. Теперь откройте в редакторе setup.nsi:
Как видите он практически пустой за исключением нескольких строк (дальше при ссылках на строку буду указывать ее номер отображаемый слева (там пока 1, 2, 3, …, 9):
Строка 1 – подключаем файл с базовым скриптом;
Строка 3 – вставляем макрос с базовым скриптом;
Строки 7 и 9 – задаем начало и конец описаний секций;
6. Теперь отредактируйте файл setup.nsi:
Строки 5 и 8 – задаем начало и конец секции, каждая такая секция при компиляции скрипта преобразуется в одну строчку с чек-боксом на экране выбора устанавливаемых пакетов, у команды Section быть до один или два параметра: первый – имя секции, второй – ее описание, которое сейчас задается в строке 11;
Строка 6 – указываем, что распаковывать нужно в {Мои документы}\EAGames\Sims 2\Downloads;
Строка 7 – указываем, что копировать нужно файл ar_wall.package, лежащий в папке example. Папку example мы используем для удобства, чтобы не сваливать файлы проекта в кучу, таких папок можно создать сколько нужно и назвать их как удобно. Главное удобство, при их использовании, что можно не перечислять файлы поименно, а использовать стандартный символ замены “*”, например File “example\*.*” скопирует все файлы из папки example;
7. Сохраните результаты;
8. В проводнике Windows, нажмите на файле setup.nsi правой кнопкой и выберите Compile NSIS Script;
9. Если все сделано правильно, то в папке проекта будет создан файл с именем {AR_NAME} Setup.exe, где вместо {AR_NAME} будет подставлено ее значение;
10. Теперь можно испытать, то что получилось, запустите:
После нажатия на кнопку “Установить”:
- в папке Downloads будет создана подпапка с именем {AR_NAME}, если папка существует, то все файлы из нее будут удалены (нужно для корректного обновления версий);
- в нее скопированы файлы list.txt и ar_wall.package;
- в реестре создана запись в секции “Uninstall” для “Установки и удаления программ” Windows;
- в папке оригиналом игры The Sims создан анинсталлер с именем Un_{AR_NAME}.exe;
11. Если все заработало, то продолжим. Зайдите в “Установку и удаление программ” Windows, найдите ваш пакет (называться от будет по значению {AR_INST_NAME} и удалите его;
12. Зайдите теперь в папку examples и переименуйте файл ar_wall.package в {AR_NAME}_wall.package, где {AR_NAME} то значение которое вы ему дали;
13. Откройте файл setup.nsi и отредактируйте его:
14. Скомпилируйте как написано в п.7 и запустите; установщик работает подобно предыдущему примеру, но копирует файл {AR_NAME}_wall.package не в Downloads, а в {Sims 2}\TSData\Res\Catalog\Bins;
15. Убедившись что все работает, удалите пакет.
Вот, в принципе, и все, этого достаточно, чтобы написать инсталлятор для большинства модов. Напоследок несколько замечаний:
- все команды пишутся с новой строки;
- количество секций Section…SectionEnd практически не ограничено; секция MUI_FUNCTION_DECRIPTION_BEGIN…MUI_FUNCTION_DECRIPTION_END должна быть одна;
- имена описаний секций (Sec_Kir в примере) должны быть уникальными для каждой секции;
- если после слова Section перед ее названием поставить “/o” (без кавычек), то “галка”, в соответствующем чек-боксе будет снята;
- количество команд !insertmacro и File внутри секции не ограничено, первой командой в секции должна быть !insertmacro, чтобы не возникло ситуации когда файлы копируются непонятно куда;
- в команде !insertmacro для указания пути копирования можно использовать:
- SavesDl – подпапка папки Downloads;
- EP0Bins – {Sims2}\TSData\Res\Catalog\Bins;
- EP0Skins – {Sims2}\TSData\Res\Catalog\Skins;
- EP0Over – {Sims2}\TSData\Res\Overrides;
- LEPBins – {Последний аддон}\TSData\Res\Catalog\Bins;
- LEPSkins – {Последний аддон}\TSData\Res\Catalog\Skins;
- LEPOver – {Последний аддон}\TSData\Res\Overrides;
- последний аддон задается в параметре AR_LEP файла ar_sims_consts.nsh
соответствующей ему веткой реестра;- поскольку код для автоматического удаления модов генерируется автоматически, существует ограничение на имена файлов, копируемых в подпапки TSData: файлы должны начинаться с {AR_NAME} или z_{AR_NAME}, сделано это потому, что иначе будет невозможно отличить их от файлов игры и файлов других пакетов;
- файлы копируемые в Downloads могут называться произвольно;
- при копировании файлов папки в которых они лежат (example в примере) не копируются, для того чтобы скопировать и папки тоже поставьте “/r” после команды File
перед именем файла;- пакеты созданные с использованием данного заголовочного файла автоматически создаются в режиме Solid LZMA и по степени сжатия превосходят архивы zip и rar;
- все команды описаны в помощи на NSIS.