• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Важно Конвертирование лиц из Gothic I в Gothic II и обратно

Статус
В этой теме нельзя размещать новые ответы.

MEG@VOLT

★★★★★★★★★
ТехАдмин
Регистрация
24 Мар 2006
Сообщения
9.103
Благодарности
6.070
Баллы
1.565
Введение

Данная статья посвящена конвертированию, нередко у модостроителей возникает необходимость вставить в свое творение(мод) какого-либо НПЦ из другой части игры. Эта же необходимость, возникла и у меня при разработке модификации Stronghand (alpha).
И так начнем.
Главной задачей в этом деле является внешность НПЦ, а главной узнаваемой частью тела НПЦ является его лицо . :)
И хоть в Г1 и Г2а текстуры лиц абсолютно одинаковые, но в скриптологии Gothic I и Gothic II способ задания внешнего вида НПЦ существенно отличается, также же как и измененная нумерация текстур лиц.
Для начала рассмотрим общий формат текстуры, не отличающийся в Gothic I и Gothic II.
Итак, текстура лица представляет собой графический файл с разрешением "256*128", изначально в формате "*.TGA", а впоследствии компилированный в понятный для игры формат "*.TEX" с префиксом "-C" перед расширением файла, но это нам мало интересно. :)
Важнее имя файла текстуры, например: "HUM_HEAD_V0_C0-C.TEX", далее будем рассматривать ИМЯ ТЕКСТУРЫ с нужными нам данными без префикса и расширения, т.е. "HUM_HEAD_V0_C0".
  • "HUM_HEAD" - означает принадлежность к модели головы.
  • "_V0" - номер ТЕКСТУРЫ головы, далее ЛИЦО (Используется в Gothic I и Gothic II)
  • "_C0" - номер ПАЛИТРЫ цвета кожи, далее ПАЛИТРА (Используется только в Gothic I, подробнее ниже)
Функция Mdl_SetVisualBody

Основная функция Mdl_SetVisualBody, используемая в обеих частях игры, но в Gothic I напрямую, а в Gothic II через дополнительную внешнюю функцию B_SetNpcVisual.
Используя описание **Vam’а** под редакцией **TycoooN’a**, это выглядит так:
Код:
void Mdl_SetVisualBody (c_npc self, string body, int bodytex, int COLOR, string head, int HTEX, int ttex, int armor);
Установить параметры изображения НПС self, где :
  • body – имя mesh файла модели тела,
  • bodytex – номер текстуры тела,
  • COLOR – номер палитры цвета кожи,
  • head – имя MMS файла модели головы,
  • HTEX – номер текстуры головы,
  • ttex – номер текстуры зубов,
  • armor – номер(инстанция) одетой брони (-1 – брони нет).
В Г1 в отличие от Г2а ЛИЦО задается двумя числами т.к. ТЕКСТУРА ЛИЦА взаимосвязана с ПАЛИТРОЙ, которая также привязана к ТЕКСТУРЕ ТЕЛА НПЦ, т.е в Г1 у одной ТЕКСТУРЫ ЛИЦА и ТЕКСТУРЫ ТЕЛА должна быть общая ПАЛИТРА.
В Г2а перестали использовать нумерацию ПАЛИТРЫ, переведя все исчисление только на нумерацию ТЕКСТУР, т.е. в Г2а ПАЛИТРА всегда имеет нулевое значение как и ТЕКСТУРА ТЕЛА, поэтому для любой ТЕКСТУРЫ ТЕЛА, независимо от оттенка кожи (ПАЛИТРЫ), можно подставить любую ТЕКСТУРУ ЛИЦА.
Задание внешности

Задание внешности в Г1:
Код:
Mdl_SetVisualBody (НПЦ, МОДЕЛЬ_ТЕЛА, ТЕКСТУРА_ТЕЛА, ПАЛИТРА, МОДЕЛЬ_ГОЛОВЫ, ТЕКСТУРА_ЛИЦА, ТЕКСТУРА_ЗУБОВ, ДОСПЕХИ);
Задание внешности в Г2а:
Код:
B_SetNpcVisual(НПЦ, ПОЛ, МОДЕЛЬ_ГОЛОВЫ, ТЕКСТУРА_ЛИЦА, ТЕКСТУРА_ТЕЛА, ДОСПЕХИ);
Как видно, в Г2а многое было упрощено через внешнюю функцию B_SetNpcVisual, далее ниже представлены примеры задания внешности Торуса в Г1 и Г2а.
Еще ниже представлена ТАБЛИЦА КОНСТАНТ, которые используются в Г2а для задания ТЕКСТУРЫ ЛИЦА, хотя вместо констант можно писать и простые числа.
И в самом низу идут две ТАБЛИЦЫ ПЕРЕКОДИРОВКИ лиц из формата Г1 в Г2а и наоборот.
Пример из Готики 1 (Торус):
Код:
Mdl_SetVisualBody (self,"hum_body_Naked0",0,3,"Hum_Head_Fighter", 12,0,GRD_ARMOR_H);
Итак в данном случае у Торуса в Г1 ТЕКСТУРА ЛИЦА имеет номер 12, с ПАЛИТРОЙ номер 3. В таблице перекодировки (Г1 в Г2а) находим, что в Г2а это соответствует текстуре номер 4
Пример из Готики 2 (Торус):
Код:
B_SetNpcVisual(self,MALE,"Hum_Head_Fighter",Face_B_Thorus,BodyTex_B,ITAR_Thorus_Addon);
Теперь попробуем перекодировать из формата Г2а в формат Г1.
В Данном случае у Торуса ТЕКСТУРА ЛИЦА имеет константу Face_B_Thorus, что равно 4, если смотреть таблицу констант, (см. пример выше), теперь ищем в таблице перекодировки (Г2а в Г1), соответствующую ТЕКСТУРУ Г2а и получаем для Г1 ТЕКСТУР 12 и ПАЛИТРУ 3.
Найдя необходимые текстуры и палитры, дело закончено остается вставить нужное в игру.
Приложение

Таблица констант для лиц персонажей Готики 2 Ночь Ворона

Код:
// ------- Gesichter fьr Mдnner ------
const int Face_N_Gomez                =    0    ;
const int Face_N_Scar                =    1    ;
const int Face_N_Raven                =    2    ;
const int Face_N_Bullit                =    3    ;    //zu lieb!
const int Face_B_Thorus                =    4    ;
const int Face_N_Corristo            =    5    ;
const int Face_N_Milten                =    6    ;
const int Face_N_Bloodwyn            =    7    ;    //zu lieb!
const int Face_L_Scatty                =    8    ;
const int Face_N_YBerion            =    9    ;
const int Face_N_CoolPock            =    10    ;
const int Face_B_CorAngar            =    11    ;
const int Face_B_Saturas            =    12    ;
const int Face_N_Xardas                =    13    ;
const int Face_N_Lares                =    14    ;
const int Face_L_Ratford            =    15    ;
const int Face_N_Drax                =    16    ;    //Buster
const int Face_B_Gorn                =    17    ;
const int Face_N_Player                =    18    ;
const int Face_P_Lester                =    19    ;
const int Face_N_Lee                =    20    ;
const int Face_N_Torlof                =    21    ;
const int Face_N_Mud                =    22    ;
const int Face_N_Ricelord            =    23    ;
const int Face_N_Horatio            =    24    ;
const int Face_N_Richter            =    25    ;
const int Face_N_Cipher_neu            =    26    ;
const int Face_N_Homer                =    27    ;    //Headmesh thief
const int Face_B_Cavalorn            =    28    ;
const int Face_L_Ian                =    29    ;
const int Face_L_Diego                =    30    ;
const int Face_N_MadPsi                =    31    ;
const int Face_N_Bartholo            =    32    ;
const int Face_N_Snaf                =    33    ;
const int Face_N_Mordrag            =    34    ;
const int Face_N_Lefty                =    35    ;
const int Face_N_Wolf                =    36    ;
const int Face_N_Fingers            =    37    ;
const int Face_N_Whistler            =    38    ;
const int Face_P_Gilbert            =    39    ;
const int Face_L_Jackal                =    40    ;
//Pale
const int Face_P_ToughBald            =    41    ;
const int Face_P_Tough_Drago        =    42    ;
const int Face_P_Tough_Torrez        =    43    ;
const int Face_P_Tough_Rodriguez    =    44    ;
const int Face_P_ToughBald_Nek        =    45    ;
const int Face_P_NormalBald        =    46    ;
const int Face_P_Normal01            =    47    ;
const int Face_P_Normal02            =    48    ;
const int Face_P_Normal_Fletcher    =    49    ;
const int Face_P_Normal03            =    50    ;
const int Face_P_NormalBart01        =    51    ;
const int Face_P_NormalBart_Cronos    =    52    ;
const int Face_P_NormalBart_Nefarius=    53    ;
const int Face_P_NormalBart_Riordian=    54    ;
const int Face_P_OldMan_Gravo        =    55    ;
const int Face_P_Weak_Cutter        =    56    ;
const int Face_P_Weak_Ulf_Wohlers    =    57    ;
//Normal
const int Face_N_Important_Arto        =    58    ;
const int Face_N_ImportantGrey        =    59    ;
const int Face_N_ImportantOld        =    60    ;
const int Face_N_Tough_Lee_дhnlich    =    61    ;
const int Face_N_Tough_Skip            =    62    ;
const int Face_N_ToughBart01        =    63    ;
const int Face_N_Tough_Okyl            =    64    ;
const int Face_N_Normal01            =    65    ;
const int Face_N_Normal_Cord        =    66    ;
const int Face_N_Normal_Olli_Kahn    =    67    ;   
const int Face_N_Normal02            =    68    ;
const int Face_N_Normal_Spassvogel    =    69    ;
const int Face_N_Normal03            =    70    ;
const int Face_N_Normal04            =    71    ;
const int Face_N_Normal05            =    72    ;
const int Face_N_Normal_Stone        =    73    ;
const int Face_N_Normal06            =    74    ;
const int Face_N_Normal_Erpresser    =    75    ;
const int Face_N_Normal07            =    76    ;
const int Face_N_Normal_Blade        =    77    ;
const int Face_N_Normal08            =    78    ;
const int Face_N_Normal14            =    79    ;
const int Face_N_Normal_Sly            =    80    ;
const int Face_N_Normal16            =    81    ;
const int Face_N_Normal17            =    82    ;
const int Face_N_Normal18            =    83    ;
const int Face_N_Normal19            =    84    ;
const int Face_N_Normal20            =    85    ;
const int Face_N_NormalBart01        =    86    ;
const int Face_N_NormalBart02        =    87    ;
const int Face_N_NormalBart03        =    88    ;
const int Face_N_NormalBart04        =    89    ;
const int Face_N_NormalBart05        =    90    ;
const int Face_N_NormalBart06        =    91    ;
const int Face_N_NormalBart_Senyan    =    92    ;
const int Face_N_NormalBart08        =    93    ;
const int Face_N_NormalBart09        =    94    ;
const int Face_N_NormalBart10        =    95    ;
const int Face_N_NormalBart11        =    96    ;
const int Face_N_NormalBart12        =    97    ;
const int Face_N_NormalBart_Dexter    =    98    ;
const int Face_N_NormalBart_Graham    =    99    ;
const int Face_N_NormalBart_Dusty    =    100    ;
const int Face_N_NormalBart16        =    101    ;
const int Face_N_NormalBart17        =    102    ;
const int Face_N_NormalBart_Huno    =    103    ;
const int Face_N_NormalBart_Grim    =    104    ;
const int Face_N_NormalBart20        =    105    ;
const int Face_N_NormalBart21        =    106    ;
const int Face_N_NormalBart22        =    107    ;
const int Face_N_OldBald_Jeremiah    =    108    ;
const int Face_N_Weak_Ulbert        =    109    ;
const int Face_N_Weak_BaalNetbek    =    110    ;
const int Face_N_Weak_Herek            =    111    ;
const int Face_N_Weak04                =    112    ;
const int Face_N_Weak05                =    113    ;
const int Face_N_Weak_Orry            =    114    ;
const int Face_N_Weak_Asghan        =    115    ;
const int Face_N_Weak_Markus_Kark    =    116    ;
const int Face_N_Weak_Cipher_alt    =    117    ;
const int Face_N_NormalBart_Swiney    =    118    ;
const int Face_N_Weak12                =    119    ;
//Latinos
const int Face_L_ToughBald01        =    120    ;
const int Face_L_Tough01            =    121    ;
const int Face_L_Tough02            =    122    ;
const int Face_L_Tough_Santino        =    123    ;
const int Face_L_ToughBart_Quentin    =    124    ;
const int Face_L_Normal_GorNaBar    =    125    ;
const int Face_L_NormalBart01        =    126    ;
const int Face_L_NormalBart02        =    127    ;
const int Face_L_NormalBart_Rufus    =    128    ;
//Black
const int Face_B_ToughBald            =    129    ;
const int Face_B_Tough_Pacho        =    130    ;
const int Face_B_Tough_Silas        =    131    ;
const int Face_B_Normal01            =    132    ;
const int Face_B_Normal_Kirgo        =    133    ;
const int Face_B_Normal_Sharky        =    134    ;
const int Face_B_Normal_Orik        =    135    ;
const int Face_B_Normal_Kharim        =    136    ;
// ------ Gesichter fьr Frauen ------
const int FaceBabe_N_BlackHair        =    137    ;
const int FaceBabe_N_Blondie        =    138    ;
const int FaceBabe_N_BlondTattoo    =    139    ;
const int FaceBabe_N_PinkHair        =    140    ;
const int FaceBabe_L_Charlotte        =    141    ;
const int FaceBabe_B_RedLocks        =    142    ;
const int FaceBabe_N_HairAndCloth    =    143    ;
//
const int FaceBabe_N_WhiteCloth        =    144    ;
const int FaceBabe_N_GreyCloth        =    145    ;
const int FaceBabe_N_Brown            =    146    ;
const int FaceBabe_N_VlkBlonde        =    147    ;
const int FaceBabe_N_BauBlonde        =    148 ;
const int FaceBabe_N_YoungBlonde    =    149    ;
const int FaceBabe_N_OldBlonde        =    150 ;
const int FaceBabe_P_MidBlonde        =    151 ;
const int FaceBabe_N_MidBauBlonde    =    152 ;
const int FaceBabe_N_OldBrown        =    153 ;
const int FaceBabe_N_Lilo            =    154 ;
const int FaceBabe_N_Hure            =    155 ;
const int FaceBabe_N_Anne            =    156 ;
const int FaceBabe_B_RedLocks2        =    157    ;
const int FaceBabe_L_Charlotte2        =    158 ;
//-----------------ADD ON---------------------------------
const int Face_N_Fortuno        =    159;
//Piraten
const int Face_P_Greg        =    160;
const int Face_N_Pirat01    =    161;
const int Face_N_ZombieMud    =    162;
===== Таблица перекодировки из Г2а в Г1 =====
Г2а => Г1
Номер ТЕКСТУРЫ Г2а => Номер ТЕКСТУРЫ Г1|Номер ПАЛИТРЫ Г1
Код:
0 => 85|1
1 => 79|1
2 => 6|1
3 => 57|1
4 => 12|3
5 => 84|1
6 => 76|1
7 => 18|1
8 => 5|2
9 => 83|1
10 => 3|1
11 => 11|3
12 => 7|3
13 => 82|1
14 => 87|1
15 => 9|2
16 => 39|1
17 => 13|3
18 => 9|1
19 => 17|0
20 => 88|1
21 => 53|1
22 => 109|1
23 => 91|1
24 => 99|1
25 => 89|1
26 => 51|1
27 => 5|1
28 => 10|3
29 => 14|2
30 => 15|2
31 => 117|1
32 => 11|1
33 => 81|1
34 => 36|1
35 => 37|1
36 => 38|1
37 => 56|1
38 => 97|1
39 => 16|0
40 => 4|2
41 => 13|0
42 => 4|0
43 => 5|0
44 => 6|0
45 => 2|0
46 => 18|0
47 => 12|0
48 => 14|0
49 => 1|0
50 => 20|0
51 => 11|0
52 => 7|0
53 => 8|0
54 => 9|0
55 => 0|0
56 => 3|0
57 => 10|0
58 => 10|1
59 => 110|1
60 => 78|1
61 => 103|1
62 => 19|1
63 => 12|1
64 => 45|1
65 => 102|1
66 => 104|1
67 => 106|1
68 => 107|1
69 => 111|1
70 => 115|1
71 => 116|1
72 => 13|1
73 => 16|1
74 => 17|1
75 => 35|1
76 => 46|1
77 => 47|1
78 => 48|1
79 => 49|1
80 => 55|1
81 => 8|1
82 => 92|1
83 => 93|1
84 => 94|1
85 => 95|1
86 => 0|1
87 => 108|1
88 => 112|1
89 => 2|1
90 => 40|1
91 => 4|1
92 => 42|1
93 => 43|1
94 => 44|1
95 => 50|1
96 => 52|1
97 => 54|1
98 => 58|1
99 => 67|1
100 => 68|1
101 => 69|1
102 => 70|1
103 => 71|1
104 => 72|1
105 => 73|1
106 => 74|1
107 => 7|1
108 => 80|1
109 => 100|1
110 => 101|1
111 => 105|1
112 => 113|1
113 => 114|1
114 => 14|1
115 => 15|1
116 => 77|1
117 => 90|1
118 => 41|1
119 => 98|1
120 => 3|2
121 => 10|2
122 => 11|2
123 => 12|2
124 => 8|2
125 => 16|2
126 => 0|2
127 => 1|2
128 => 2|2
129 => 3|3
130 => 4|3
131 => 5|3
132 => 1|3
133 => 2|3
134 => 6|3
135 => 8|3
136 => 9|3
Девицы
с 137 по 158, в Г1 отсутствуют.
159 => 27|1
160 - 162 Только в аддоне
Таблица перекодировки из Г1 в Г2а

Г1 => Г2а
Номер ТЕКСТУРЫ Г1|Номер ПАЛИТРЫ Г1 => Номер ТЕКСТУРЫ Г2а
Код:
0|0 => 55
0|1 => 86
0|2 => 126
1|0 => 49
1|1 => 118 !
1|2 => 127
1|3 => 132
2|0 => 45
2|1 => 89
2|2 => 128
2|3 => 133
3|0 => 56
3|1 => 10
3|2 => 120
3|3 => 129
4|0 => 42
4|1 => 91
4|2 => 40
4|3 => 130
5|0 => 43
5|1 => 27
5|2 => 8
5|3 => 131
6|0 => 44
6|1 => 2
6|3 => 134
7|0 => 52
7|1 => 107
7|3 => 12
8|0 => 53
8|1 => 81
8|2 => 124
8|3 => 135
9|0 => 54
9|1 => 18
9|2 => 15
9|3 => 136
10|0 => 57
10|1 => 58
10|2 => 121
10|3 => 28
11|0 => 51
11|1 => 32
11|2 => 122
11|3 => 11
12|0 => 47
12|1 => 63
12|2 => 123
12|3 => 4
13|0 => 41
13|1 => 72
13|3 => 17
14|0 => 48
14|1 => 114
14|2 => 29
15|1 => 115
15|2 => 30
16|0 => 39
16|1 => 73
16|2 => 125
17|0 => 19
17|1 => 74
18|0 => 46
18|1 => 7
19|1 => 62
20|0 => 50
35|1 => 75
36|1 => 34
37|1 => 35
38|1 => 36
39|1 => 16
40|1 => 90
41|1 => 118
42|1 => 92
43|1 => 93
44|1 => 94
45|1 => 64
46|1 => 76
47|1 => 77
48|1 => 78
49|1 => 79
50|1 => 95
51|1 => 26
52|1 => 96
53|1 => 21
54|1 => 97
55|1 => 80
56|1 => 37
57|1 => 3
58|1 => 98
67|1 => 99
68|1 => 100
69|1 => 101
70|1 => 102
71|1 => 103
72|1 => 104
73|1 => 105
74|1 => 106
76|1 => 6
77|1 => 116
78|1 => 60
79|1 => 1
80|1 => 108
81|1 => 33
82|1 => 13
83|1 => 9
84|1 => 5
85|1 => 0
87|1 => 14
88|1 => 20
89|1 => 25
90|1 => 117
91|1 => 23
92|1 => 82
93|1 => 83
94|1 => 84
95|1 => 85
96 - отсутствует
97|1 => 38
98|1 => 119
99|1 => 24
100|1 => 109
101|1 => 110
102|1 => 65
103|1 => 61
104|1 => 66
105|1 => 111
106|1 => 67
107|1 => 68
108|1 => 87
109|1 => 22
110|1 => 59
111|1 => 69
112|1 => 88
113|1 => 112
114|1 => 113
115|1 => 70
116|1 => 71
117|1 => 31
В общем создание таблиц перекодировки заняло у меня 5 часов работы. ;)
Тут что-то про текстуры сектантов из Г1, которых нет в Г2а... я уже и сам не помню, чего это за нумерация, видимо продолжение после основных текстур Г2а.
Код:
13 165
15 166
19 167
20 168
21 169
22 170
23 171
24 172
25 173
26 174
27 159
28 175
29 176
30 177
31 178
32 179
33 180
34 181
59 182
60 183
61 184
62 185
63 186
64 187
65 188
66 189
0 3 190
6 2 191
7 2 192
75 193
86 194
Авторство

Материал составлен и подготовлен Ukur aka BlackWolf
(c) 2008 Mighty DWARF
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу