Создание полнофункциональных врат Привет модостроители!! Наверное, дел...
X3 Terran Conflict / X3 Земной конфликт
 
X3 Terran conflict  
 

На сайте онлайн (человек): 49



 



Создание полнофункциональных врат Привет модостроители!! Наверное, дел...

Terran Conflict (X3TC) / Форум / Скрипты и моды для X3 Terran Conflict / Гайд-Парк

Автор: YOYOMAN
(01.10.2011 20:07:44)

Создание полнофункциональных врат

     Привет модостроители!! Наверное, делая множество модов, вы когда-нибудь сталкивались с созданием новых врат (типов), вдобавок к оригинальным 25 типам врат. Но всегда вы видели весьма странный значок на всех новых вратах - "Х" - и также загадочные "???" перед названием ваших новых врат, ну и, конечно, Readtext в поле серийного номера.
     В этом уроке я расскажу, как создать и корректно "засунуть "  новые типы врат.

Инструментарий для работы:

  • Х3 Editor 2*
  •  для obj файлов от Cheker Two.
  • WordPad.

*Знание Х3 Editor 2 обязательно!

Необходимые файлы для работы:

  • Ваши новые модели врат и их сцены.
  • TGates.
  • IconTypes.
  • L001-007.
  • x3story.obj.
  • x3intro.obj.



     Все готовы? Вперёд!!!

Этап 1: Создание строк врат в файле TGates.

     Открываем Х3 Editor 2  и ищем TGates (он находится в 07. сат\types). Создаём новый каталог, называем его 14 (дат тоже кстати). Копируем в наш архив, открываем. Вот главные элементы окна TGates: 



1 - номер и имя врат в списке.
2 - идентификатор (ID) - очень важная часть  строки врат.
3 - субтип - он всегда равен "-1", ( Об этом чуть дальше.)
4 - номер строчки в языковом файле, где находится имя.
5 - путь к сцене врат.

     Все остальные поля без изменений.


  1. Копируем любую строчку правой кнопкой и выбираем "Paste to end". Копируем 4 раза, так как врата имеют направление на 4 стороны: север, юг, запад, восток. ( ХАБовские врата специальные!)
  2. Ставим свои идентификаторы. Идентификатор  вот такого вида: SS_WG_ваше уникальное имя_NORTH, ..._SOUTH, ..._WEST и ..._EAST
  3. Дописываем в языковый файл имя своих врат, ставим сюда номер вашей строки или же используем стандартное имя (3731).
  4. Прописываем путь к сцене новых врат. Формат пути для примера: others\ваше имя_scene .
  5. Сохраняем файл и закрываем редактор.  Потом заново запускаем. Я делаю это для того, чтобы новые элементы заняли свои места нормально, хотя, может, это мой прикол...

 

Этап 2: Установка значков (иконок).

     Все новые добавленные типы врат имеют весьма странный значок (иконку) - "Х". Кстати, именно новые Земные врата с такой иконкой. Текущая иконка нас не устраивает, поэтому нужно всем новым типам врат установить нормальные иконки, соответствующие направлению врат, а именно: N, S, W, E.
     Для этого нужно дописать идентификаторы (ID) новых типов врат в файл IconTypes. Берём его из 03.сат\types, копируем и переносим в наш архив. Открываем IconTypes и листаем до тех пор, пока не найдем вот такую конструкцию:



1. - Название раздела, соответственно  в этом разделе  прописываются значки типам врат.
2. - Общее количество прописанных типов врат - идентификаторов (ID).
3. - Весь список строк, которые хранятся в этом разделе.


1) Прописываем в конец строк свои 4 вот так:
 Код:
  1. SS_WG_имя_NORTH;ICON_TRG_GATE_N;0;0;
  2. SS_WG_имя_SOUTH;ICON_TRG_GATE_S;0;0;
  3. SS_WG_имя_WEST;ICON_TRG_GATE_W;0;0;
  4. SS_WG_имя_EAST;ICON_TRG_GATE_E;0;0;
 

2) Увеличиваем общее число строк в разделе SSTYPE_WARPGATE; на 4 , так как мы добавили только 4 новых строки.
 Код:
  1. SSTYPE_WARPGATE;
  2. ICON_TRG_GATE_X;0;0;
  3. 0;0;0;
  4. <b>18</b>;
 


     Полная конструкция должна выйти вот такая:
 Код:
  1. SSTYPE_WARPGATE;
  2. ICON_TRG_GATE_X;0;0;
  3. 0;0;0;
  4. 18;
  5. SS_WG_NORTH;ICON_TRG_GATE_N;0;0;
  6. SS_WG_SOUTH;ICON_TRG_GATE_S;0;0;
  7. SS_WG_WEST;ICON_TRG_GATE_W;0;0;
  8. SS_WG_EAST;ICON_TRG_GATE_E;0;0;
  9. SS_WG_T_NORTH;ICON_TRG_GATE_N;0;0;
  10. SS_WG_T_SOUTH;ICON_TRG_GATE_S;0;0;
  11. SS_WG_T_WEST;ICON_TRG_GATE_W;0;0;
  12. SS_WG_T_EAST;ICON_TRG_GATE_E;0;0;
  13. SS_WG_HUB_NORTH;ICON_TRG_GATE_CRC1;0;0;
  14. SS_WG_HUB_SOUTH;ICON_TRG_GATE_CRC2;0;0;
  15. SS_WG_HUB_WEST;ICON_TRG_GATE_SQR1;0;0;
  16. SS_WG_HUB_EAST;ICON_TRG_GATE_SQR2;0;0;
  17. SS_WG_HUB_UP;ICON_TRG_GATE_TRI1;0;0;
  18. SS_WG_HUB_DOWN;ICON_TRG_GATE_TRI2;0;0;
  19. SS_WG_имя_NORTH;ICON_TRG_GATE_N;0;0;
  20. SS_WG_имя_SOUTH;ICON_TRG_GATE_S;0;0;
  21. SS_WG_имя_WEST;ICON_TRG_GATE_W;0;0;
  22. SS_WG_имя_EAST;ICON_TRG_GATE_E;0;0;
 

     Сохраняем файл и закрываем редактор.


Этап 3: Исправление Readtext в серийном номере новых врат.

     После создания новых врат может появиться Readtext в серийном номере. Увидеть это можно только включив игру и соединив новые врата. Если всё таки Readtext присутствует вместо первых двух букв серийного номера (Readtext-1263-строка необходимая игре серийном номере новых врат), это означает, что не загружена строка на странице 1263 "Shipclass IDs" и её нужно создать.

 

1. - Страница 1263 "Shipclass IDs"
2. - Строки на этой странице.


     Для устранения этой проблемы нужно выполнить несколько действий:
  1. Открываем с помощью Х3 Editor 2 языковый файл L001-007.
  2. Прокручиваем список и находим страницу 1263 "Shipclass IDs".
  3. Создаём новую строку с  номером тем что требует игра. Возможно нужно будет создать несколько таких строк.

Сохраняем и закрываем Х3 Editor 2. Больше он нам не понадобится.


Этап 4: Правка x3story.obj - прописывание новых типов врат.


     Итак, мы подошли к предпоследнему и очень важному этапу. Править x3story.obj мы будем WordPadoм, предварительно диссасемблировав его. Делаем вот так:
  1.  Качаем Ассемблер и Дисассемблер
  2.  Создаем отдельную для удобства папку с произвольным именем, я назвал "OBJ".
  3.  В ней создадим ещё  две папки с названиями понятными: COMPILE и DECOMPILE (Названия произвольные, лишь бы вам понятно было)
  4.  В папку COMPILE распаковуем архив с ассемблером (xa4_10b_824.zip) в папку DECOMPILE - дисассемблер (do4_13b_122.zip)
  5.  Достаем самый свежий x3story.obj версии 3.1, находящися в 13.сат\l
  6.  В папке DECOMPILE берём и тащим x3story.obj на dobj.exe и ждём пока обж будет декомпилирован.
  7.  После декомпиляции получается много файлов  в этой папке, нас же интересует файл x3story.asm, открываем его WordPadoм.
  8.  Теперь нам нужно найти фунции, которые отвечают за типы врат. Вбиваем в поиск первую функцию:
     Код:
    1. <b>function  GATE.GetDirectionName()</b>
     

    WordPad находит секцию с именем: GetDirectionName, листаем немного вниз. Нас интересует длинный список команд:
     Код:
    1. L00086379: xjump      25d, 0
    2.                  .long      L00086373 ; 0 : default
    3.                  .long      L00086337 ; 1 : 0
    4.                  .long      L00086343 ; 2 : 1
    5.                  .long      L0008634F ; 3 : 2
    6.                  .long      L0008635B ; 4 : 3
    7.                  .long      L00086373 ; 5 : 4
    8.                  .long      L00086337 ; 6 : 5
    9.                  .long      L00086343 ; 7 : 6
    10.                  .long      L0008634F ; 8 : 7
    11.                  .long      L0008635B ; 9 : 8
    12.                  .long      L00086367 ; 10 : 9
    13.                  .long      L00086367 ; 11 : 10
    14.                  .long      L00086367 ; 12 : 11
    15.                  .long      L00086367 ; 13 : 12
    16.                  .long      L00086367 ; 14 : 13
    17.                  .long      L00086367 ; 15 : 14
    18.                  .long      L00086367 ; 16 : 15
    19.                  .long      L00086367 ; 17 : 16
    20.                  .long      L00086367 ; 18 : 17
    21.                  .long      L00086367 ; 19 : 18
    22.                  .long      L00086367 ; 20 : 19
    23.                  .long      L00086367 ; 21 : 20
    24.                  .long      L00086337 ; 22 : 21
    25.                  .long      L00086343 ; 23 : 22
    26.                  .long      L0008635B ; 24 : 23
    27.                  .long      L0008634F ; 25 : 24
     

         Сверху - 25d - это общее число прописаных адресов  (типов врат). На данный момент их 25. Увеличиваем это число на 4, то есть должно выйти:
     Код:
    1. L00086379: xjump      29d, 0
     

         Дальше переходим к самим командам. Обратите внимание на запись цифр после каждого адреса вида  L00086ХХ. Первая цифра - это номер врат по порядку в TGates, вторая - субтип. Я раньше говорил про Субтип врат и что он равен -1. Вот вторая цифра и означет  "номер врат -1". Для прописки своих типов врат копируем эти строки в конец:
      
     Код:
    1.                  .long      L00086337 ; 1 : 0
    2.                  .long      L00086343 ; 2 : 1
    3.                  .long      L0008634F ; 3 : 2
    4.                  .long      L0008635B ; 4 : 3
     

     и меняем  вот так:
     Код:
    1.                  .long      L00086337 ; 26 : 25
    2.                  .long      L00086343 ; 27 : 26
    3.                  .long      L0008634F ; 28 : 27
    4.                  .long      L0008635B ; 29 : 28
     

    В результате выходит код с 29 строками:
     Код:
    1. L00086379: xjump      29d, 0
    2.                  .long      L00086373 ; 0 : default
    3.                  .long      L00086337 ; 1 : 0
    4.                  .long      L00086343 ; 2 : 1
    5.                  .long      L0008634F ; 3 : 2
    6.                  .long      L0008635B ; 4 : 3
    7.                  .long      L00086373 ; 5 : 4
    8.                  .long      L00086337 ; 6 : 5
    9.                  .long      L00086343 ; 7 : 6
    10.                  .long      L0008634F ; 8 : 7
    11.                  .long      L0008635B ; 9 : 8
    12.                  .long      L00086367 ; 10 : 9
    13.                  .long      L00086367 ; 11 : 10
    14.                  .long      L00086367 ; 12 : 11
    15.                  .long      L00086367 ; 13 : 12
    16.                  .long      L00086367 ; 14 : 13
    17.                  .long      L00086367 ; 15 : 14
    18.                  .long      L00086367 ; 16 : 15
    19.                  .long      L00086367 ; 17 : 16
    20.                  .long      L00086367 ; 18 : 17
    21.                  .long      L00086367 ; 19 : 18
    22.                  .long      L00086367 ; 20 : 19
    23.                  .long      L00086367 ; 21 : 20
    24.                  .long      L00086337 ; 22 : 21
    25.                  .long      L00086343 ; 23 : 22
    26.                  .long      L0008635B ; 24 : 23
    27.                  .long      L0008634F ; 25 : 24
    28.                  .long      L00086337 ; 26 : 25
    29.                  .long      L00086343 ; 27 : 26
    30.                  .long      L0008634F ; 28 : 27
    31.                  .long      L0008635B ; 29 : 28
     

  9.  Следующая на очереди функция. Вбиваем в поиск вот эту функцию:
     Код:
    1. <b>function  GATE.GetDirectionFromSubtype()</b>
     

         WordPad находит секцию с именем: GetDirectionFromSubtype. В этой секции сделать так же, как в пункте 8! Единственное, тут другие адреса, но также брать вот эти:
     Код:
    1.                  .long      L000864C7 ; 1 : 0
    2.                  .long      L000864C9 ; 2 : 1
    3.                  .long      L000864CB ; 3 : 2
    4.                  .long      L000864CD ; 4 : 3
     

  10.  Последнее, что нужно править в x3story.obj , это версию. Просто при любой компиляции .obj файла версия игры будет "?". Это происходит, если вы начнёте новую игру, сохранитесь и захотите загрузить эту сохранку. Тем более, вам полюбому придётся начать заново, ведь имена назначения врат записываются в сохранения - старые сохрания больше не поддерживаются!

Итак, вносим в поиск эту функцию:
 Код:
  1. <b>function  GetVersionString(arg1)</b>
 

попадаем в секцию GetVersionString здесь можно увидеть все версии, которые были пропатчены до версии 3.1. Листаем в конец списка, нужно найти вот этот кусочек:
 Код:
  1. L00000D68: pushw      3600d ; 0E10h
  2.            if SP[0]<=SP[1] then push 0 else push 1
  3.            if SP[0]=0 then jump L00000D77
  4.            get_strg   S0001B993 ; "v3.1"
  5.            ret
  6. L00000D77: get_strg   S0000055B ; "?"
  7.            ret
  8. ;           push       0
  9. ;           ret
 

Менять нужно самую последнюю строчку:
 Код:
  1. L00000D77: get_strg   S0000055B ; "?"
 

     Нужно скопировать адрес строки версии 3.1 ("v3.1") и вставить вместо адреса строки для неизвестной версии ("?"), вот так:
 Код:
  1. L00000D68: pushw      3600d ; 0E10h
  2.            if SP[0]<=SP[1] then push 0 else push 1
  3.            if SP[0]=0 then jump L00000D77
  4.            get_strg   S0001B993 ; "v3.1"
  5.            ret
  6. L00000D77: get_strg   <i><b>S0001B993</b></i> ; "?"
  7.            ret
  8. ;           push       0
  9. ;           ret
 

     Далее после всех операций сохраняем наш asm файл.
     Правка x3story.obj успешно завершена, можете его компилить, перетащив x3story.asm на асемблер xa_asm.exe, ждём компиляции. Если вы не сделали ошибок при правке x3story.asm, то в папке с асемблером появится файлик с именем: x3story.cod, теперь смело меняем расширение файла .cod на .obj. Всё, новый x3story.obj у вас есть, можете его переместить в ваш модархив.

Этап 5: Правка x3intro.obj - установка соотвествия значений версий игры.


     Это последний этап даного урока, идентичный последнему пункту из этапа 4. Чтобы версия игры правильно отображалась, мало изменить адрес строки версии в x3story.obj. Необходимо чтобы строки версии x3story.obj и x3intro.obj  совпадали, иначе вместо версии 3.1 так и останется "?".
 1) Диссаасемблируем x3intro.obj  так же как и x3story.obj. Открываем WordPadом и вписываем в поиск уже знакомую функцию:
 Код:
  1. <b>function  GetVersionString(arg1)</b>
 

Снова находим кусочек кода:
 Код:
  1. L00002B7D: pushw      3600d ; 0E10h
  2.            if SP[0]<=SP[1] then push 0 else push 1
  3.            if SP[0]=0 then jump L00002B8C
  4.            get_strg   S00000AD2 ; "v3.1"
  5.            ret
  6. L00002B8C: get_strg   S00000AD7 ; "?"
  7.            ret
  8. ;           push       0
  9. ;           ret
 

     Меняем адрес к строке версии, должно выглядеть вот так:
 Код:
  1. [code]L00002B7D: pushw      3600d ; 0E10h
  2.            if SP[0]<=SP[1] then push 0 else push 1
  3.            if SP[0]=0 then jump L00002B8C
  4.            get_strg   S00000AD2 ; "v3.1"
  5.            ret
  6. L00002B8C: get_strg   <i><b>S00000AD2</b></i> ; "?"
  7.            ret
  8. ;           push       0
  9. ;           ret
 

     Сохраняем  asm файл. Компилируем точно так же, как и x3story.asm и меняем расширение .cod на .obj , x3intro.obj - успешно изменён.

дерево темы → Гайд-Парк Гайд-Парк »
Список игр