Цель
Разбор примера модификации зданий в столице.Версия игры
«Disciples II: Восстание Эльфов» из состава «Disciples II. Летопись Вселенной».Инструменты
- D2ResExplorer (менеджер файлов ресурсов Disciples 2)
- D2DLGPreview (утилита просмотра DLG-файлов с описаниями экранов)
- D2ImgEncoder (утилита для предобработки внедряемых в игру png-изображений)
- Sdbf (простой и бесплатный DBF-редактор, описание)
- Paint.NET (или любой другой графический редактор с поддержкой png-файлов)
Общий план
1. Выбор типа модификации, здания и юнита
- в ветку лучников столицы Империи добавим новое здание «Братство» между зданиями «Стрельбище» (Рейнджер) и «Серая гильдия» (Ассасин);
- в новое здание заселим Головореза (уже существующий нейтральный юнит без развития), так что ветка развития лучников должна стать «Рейнджер» > «Головорез» > «Ассасин».
2. Подготовка тестовой карты.
3. Опишем новое здание в «Globals\Gbuild.dbf» (общая информация), «Globals\GbuiList.dbf» (принадлежность), «Globals\Tglobal.dbf» (текстовые строки).
4. Добавим в «Imgs\Capital.ff» изображение нового здания для общего вида города.
5. Добавим в «Imgs\Capital.dat» информацию об изображении нового здания для общего вида города.
6. Изменим в «Interf\Interf.ff» фоновое изображение диалога со зданиями ветки лучников (добавим окошко для нового здания).
7. Добавим в «Imgs\IconBld.ff» изображение нового здания для диалога со зданиями ветки лучников.
8. Изменим в «Interf\Interf.dlg» диалог со зданиями ветки лучников для корректного отображения новых и старых зданий.
9. Изменим в «Globals\Gunits.dbf» ветку развития лучников.
10. Проверка работоспособности.
Модификация
1. В редакторе карт создаём новую карту для отладки
- возможность играть за Империю;
- стартовые ресурсы для upgrade-а зданий и покупки юнитов;
- строения и/или жертвы для получения опыта (для проверок корректности развития лучника);
- никаких условий победы и прочих красот.
2. Модификация «Globals\Gbuild.dbf»
- открываем в DBF-редакторе файл «Globals\Gbuild.dbf»;
- изучаем записи для зданий «Стрельбище» (g000bb0010) и «Серая гильдия» (g000bb0011);
- выбираем для нового здания идентификатор (поле BUILD_ID) на 1 больше максимального в этом файле, т.е. будет g000bb0123;
- правим у записи g000bb0011 поля REQUIRED (здание после которого станет доступно строительство), COST (цена), LEVEL (уровень)
- добавляем новую запись g000bb0123;
BUILD_ID | NAME_TXT | DESC_TXT | REQUIRED | COST | LEVEL | CATEGORY | BRANCH | PIC_1 | FRAME_1 | FRAME_2 | POS_X | POS_Y | POS_CX | POS_CY | POS_Z | COMMENTS |
g000bb0010 | x000tg1010 | x000tg1110 | g000000000 | g0200:r0000:y0000:e0000:w0000 | 2 | 3 | 1 | Marksman | ||||||||
g000bb0011 | x000tg1011 | x000tg1111 | g000bb0010 | g0500:r0000:y0000:e0000:w0000 | 3 | 3 | 1 | Imperial Assassin |
BUILD_ID | NAME_TXT | DESC_TXT | REQUIRED | COST | LEVEL | CATEGORY | BRANCH | PIC_1 | FRAME_1 | FRAME_2 | POS_X | POS_Y | POS_CX | POS_CY | POS_Z | COMMENTS |
g000bb0010 | x000tg1010 | x000tg1110 | g000000000 | g0200:r0000:y0000:e0000:w0000 | 2 | 3 | 1 | Marksman | ||||||||
g000bb0011 | x000tg1011 | x000tg1111 | g000bb0123 | g0750:r0000:y0000:e0000:w0000 | 4 | 3 | 1 | Imperial Assassin | ||||||||
g000bb0123 | x000tg9923 | x000tg9924 | g000bb0010 | g0500:r0000:y0000:e0000:w0000 | 3 | 3 | 1 | Master Thug |
3. Модификация «Globals\Tglobal.dbf»
- открываем в DBF-редакторе файл «Globals\Tglobal.dbf»;
- добавляем новые записи x000tg9923 и x000tg9924;
TXT_ID | TEXT | VERIFIED | CONTEXT |
x000tg9923 | Братство | ||
x000tg9924 | Приобретя достаточный опыт, Рейнджеры станут Головорезами |
4. Модификация «Globals\GbuiList.dbf»
- открываем в DBF-редакторе файл «Globals\GbuiList.dbf»;
- изучаем записи для зданий «Стрельбище» (g000bb0010) и «Серая гильдия» (g000bb0011);
- добавляем новую запись g000bb0123:
LORD_ID | BUILD_ID |
g000LR0001 | g000bb0010 |
g000LR0001 | g000bb0011 |
LORD_ID | BUILD_ID |
g000LR0001 | g000bb0010 |
g000LR0001 | g000bb0011 |
g000LR0001 | g000bb0123 |
5. Модификация «Imgs\Capital.ff»
- открываем в D2ResExplorer файл «Imgs\Capital.ff»;
- ищем в «IndexMap Structured Data» элемент EMP_IMPGUILD (это строение «Серая гильдия»);
- экспортируем в png-файл;
- редактируем полученное изображение (напр. в Paint.NET) и сохраняем под именем EMP_IMPGUILD_MOD.PNG;
- обрабатываем изображение с помощью D2ImgEncoder и сохраняем под именем EMP_IMPHACK.PNG;
- добавляем в «IndexMap Structured Data» файл EMP_IMPHACK.PNG;
- переименовываем в «IndexMap Structured Data» новый элемент EMP_IMPHACK.PNG в EMP_IMPHACK;
- запускаем «Сортировка записей ImageMap».
6. Модификация «Imgs\Capital.dat»
- открываем файл «Imgs\Capital.dat» в каком-нибудь текстовом редакторе (напр. Блокнот aka Notepad.exe);
- изучаем секцию [HUMAN] (от строки [HUMAN] строки до строки [UNDEAD]);
- ищем в секции [HUMAN] строку
LayerInfoCount=26
заменяем на
LayerInfoCount=27 - ищем в секции [HUMAN] строку
LAYERINFO_25=0,G000BB0025,
и после неё добавляем новую строку
LAYERINFO_26=0,G000BB0123, - ищем в секции [HUMAN] строку
LayerCount=31
заменяем на
LayerCount=32 - ищем в секции [HUMAN] строку
LAYER_169=G000BB0011,EMP_IMPGUILD,0,0,0,,0,0,0,366,486,470,600
и после неё добавляем новую строку
LAYER_168=G000BB0123,EMP_IMPHACK,0,0,0,,0,0,0,366,486,470,600
где- 168 - Z-order для изображения;
- G000BB0123 — идентификатор нового здания в Gbuild;
- EMP_IMPHACK – имя изображения в Imgs\Capital.ff;
- 366,486,470,600 — координаты для отображения (задаём аналогично исходному EMP_IMPGUILD).
7. Подготовка к модификация «Interf\Interf.ff», «Imgs\IconBld.ff» и «Interf\Interf.dlg»
- открываем в D2DLGPreview файл «Interf\Interf.ff»;
- последовательно разглядывая список элементов ищем нужный нам диалог (в нашем случае - это DLG_H_ARCHER);
- обращаем внимание на DLG_H_ARCHER_TYPE_1 (фоновое изображение) и две связки IMAGE+TEXT (это отсылки к зданиям «Стрельбище» (g000bb0010) и «Серая гильдия» (g000bb0011)).
8. Модификация «Interf\Interf.ff»
- открываем в D2ResExplorer файл «Interf\Interf.ff»;
- ищем в «IndexMap Structured Data» элемент DLG_H_ARCHER_TYPE_1;
- экспортируем в png-файл;
- редактируем полученное изображение (напр. в Paint.NET) и сохраняем под именем DLG_H_ARCHER_TYPE_1.PNG;
- обрабатываем изображение с помощью D2ImgEncoder и сохраняем под именем DLG_H_ARCHER_TYPE_1_MOD.PNG;
- добавляем в «IndexMap Structured Data» файл DLG_H_ARCHER_TYPE_1_MOD.PNG;
- переименовываем в «IndexMap Structured Data» старый элемент DLG_H_ARCHER_TYPE_1 в DLG_H_ARCHER_TYPE_1_OLD;
- переименовываем в «IndexMap Structured Data» новый элемент DLG_H_ARCHER_TYPE_1_MOD.PNG в DLG_H_ARCHER_TYPE_1;
- запускаем «Сортировка записей ImageMap»;
- наблюдаем изменения диалога с помощью D2DLGPreview.
9. Модификация «Imgs\IconBld.ff»
- открываем в D2ResExplorer файл «Imgs\IconBld.ff»;
- ищем в «MQDB-контейнер» элемент G000BB0011.PNG (это строение «Серая гильдия»);
- экспортируем в png-файл;
- редактируем полученное изображение (напр. в Paint.NET) и сохраняем под именем G000BB0123.PNG в png-формате 24-bit цветов (т.е. не палитровый на 256 цветов);
- добавляем в «MQDB-контейнер» файл G000BB0123.PNG.
10. Модификация «Interf\Interf.dlg»
- открываем файл «Interf\Interf.dlg» в каком-нибудь текстовом редакторе (напр. Блокнот aka Notepad.exe);
- ищем диалог DLG_H_ARCHER;
- строку
IMAGE IMG_11,161,173,238,247,,""
заменяем на строки
IMAGE IMG_11,165,316,242,390,,""
IMAGE IMG_123,161,173,238,247,,"" - строку
TEXT TXT_11,149,253,249,269,\hC;\vC;,"",""
заменяем на строки
TEXT TXT_11,152,394,252,410,\hC;\vC;,"",""
TEXT TXT_123,149,253,249,269,\hC;\vC;,"","" - наблюдаем изменения диалога с помощью D2DLGPreview.
[!!!] Обратите особое внимание на символ табуляции (Tab) после IMAGE и TEXT. Если его не будет или вместо него будут пробелы, то игра не запустится!
11. Модификация «Globals\Gunits.dbf»
- открываем в DBF-редакторе файл «Globals\Gunits.dbf»;
- изучаем записи для юнитов «Рейнджер» (g000uu0007), «Головорез» (g000uu5031), «Ассасин» (g000uu0154);
- правим у записи g000uu0154 (Ассасин) поля LEVEL (уровень), PREV_ID (предыдущий юнит в цепочке);
- правим у записи g000uu5031 (Головорез) поля LEVEL, PREV_ID, RACE_ID (раса), SUBRACE (подраса), BRANCH (ветка в цепочке развития), UPGRADE_B ("прописка" юнита в здании), DEATH_ANIM (анимация смерти юнита);
UNIT_ID | UNIT_CAT | LEVEL | PREV_ID | RACE_ID | SUBRACE | BRANCH | SIZE_SMALL | SEX_M | ENROLL_C | ENROLL_B | NAME_TXT | DESC_TXT | ABIL_TXT | ATTACK_ID | ATTACK2_ID | ATCK_TWICE | HIT_POINT | BASE_UNIT | ARMOR | REGEN | REVIVE_C | HEAL_C | TRAINING_C | XP_KILLED | UPGRADE_B | XP_NEXT | MOVE | SCOUT | LIFE_TIME | LEADERSHIP | NEGOTIATE | LEADER_CAT | DYN_UPG1 | DYN_UPG_LV | DYN_UPG2 | WATER_ONLY | DEATH_ANIM |
g000uu0007 | 0 | 2 | g000uu0006 | g000rr0000 | 1 | 1 | True | True | g0240:r0000:y0000:e0000:w0000 | g000000000 | x000tg2007 | x000tg2507 | x000tgb006 | g000aa0007 | g000000000 | False | 90 | G000000000 | 0 | 5 | g0200:r0000:y0000:e0000:w0000 | g0002:r0000:y0000:e0000:w0000 | g0005:r0000:y0000:e0000:w0000 | 60 | g000bb0010 | 500 | g002DU0007 | 10 | g002DU0007 | 1 | |||||||
g000uu0154 | 0 | 3 | g000uu0007 | g000rr0000 | 1 | 1 | True | True | g0400:r0000:y0000:e0000:w0000 | g000000000 | x000tg2154 | x000tg2654 | x000tgb006 | g000aa0154 | g000aa1154 | False | 135 | G000000000 | 0 | 5 | g0400:r0000:y0000:e0000:w0000 | g0002:r0000:y0000:e0000:w0000 | g0005:r0000:y0000:e0000:w0000 | 140 | g000bb0011 | 1100 | g000DU0154 | 10 | g002DU0154 | 1 | |||||||
g000uu5031 | 0 | 1 | g000000000 | g000rr0004 | 5 | 0 | True | True | g0240:r0000:y0000:e0000:w0000 | g000000000 | x000tg2231 | x000tg2831 | x000tgb006 | g000aa5031 | g000aa5531 | False | 110 | G000000000 | 0 | 5 | g0200:r0000:y0000:e0000:w0000 | g0002:r0000:y0000:e0000:w0000 | g0005:r0000:y0000:e0000:w0000 | 30 | g000000000 | 250 | g000DU5031 | 10 | g002DU5031 | 5 |
UNIT_ID | UNIT_CAT | LEVEL | PREV_ID | RACE_ID | SUBRACE | BRANCH | SIZE_SMALL | SEX_M | ENROLL_C | ENROLL_B | NAME_TXT | DESC_TXT | ABIL_TXT | ATTACK_ID | ATTACK2_ID | ATCK_TWICE | HIT_POINT | BASE_UNIT | ARMOR | REGEN | REVIVE_C | HEAL_C | TRAINING_C | XP_KILLED | UPGRADE_B | XP_NEXT | MOVE | SCOUT | LIFE_TIME | LEADERSHIP | NEGOTIATE | LEADER_CAT | DYN_UPG1 | DYN_UPG_LV | DYN_UPG2 | WATER_ONLY | DEATH_ANIM |
g000uu0007 | 0 | 2 | g000uu0006 | g000rr0000 | 1 | 1 | True | True | g0240:r0000:y0000:e0000:w0000 | g000000000 | x000tg2007 | x000tg2507 | x000tgb006 | g000aa0007 | g000000000 | False | 90 | G000000000 | 0 | 5 | g0200:r0000:y0000:e0000:w0000 | g0002:r0000:y0000:e0000:w0000 | g0005:r0000:y0000:e0000:w0000 | 60 | g000bb0010 | 500 | g002DU0007 | 10 | g002DU0007 | 1 | |||||||
g000uu0154 | 0 | 4 | g000uu5031 | g000rr0000 | 1 | 1 | True | True | g0400:r0000:y0000:e0000:w0000 | g000000000 | x000tg2154 | x000tg2654 | x000tgb006 | g000aa0154 | g000aa1154 | False | 135 | G000000000 | 0 | 5 | g0400:r0000:y0000:e0000:w0000 | g0002:r0000:y0000:e0000:w0000 | g0005:r0000:y0000:e0000:w0000 | 140 | g000bb0011 | 1100 | g000DU0154 | 10 | g002DU0154 | 1 | |||||||
g000uu5031 | 0 | 3 | g000uu0007 | g000rr0000 | 1 | 1 | True | True | g0240:r0000:y0000:e0000:w0000 | g000000000 | x000tg2231 | x000tg2831 | x000tgb006 | g000aa5031 | g000aa5531 | False | 110 | G000000000 | 0 | 5 | g0200:r0000:y0000:e0000:w0000 | g0002:r0000:y0000:e0000:w0000 | g0005:r0000:y0000:e0000:w0000 | 30 | g000bb0123 | 250 | g000DU5031 | 10 | g002DU5031 | 1 |