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

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
    Скрыть объявление
  2. Форум аддона "Возвращение" 2.0:
    — Обсудить игру, почитать о прохождениях и/или разрешить свои вопросы по игре вы можете в одной из тем одноименного форума. Посетить...
    — Прочитать историю изменения и/или скачать последнюю версию аддона "Возвращение", вы можете на страницах наших ресурсов. Скачать...
    Скрыть объявление

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

Тема в разделе "Скриптинг", создана пользователем MEG@VOLT, 11 июл 2013.

Статус темы:
Закрыта.
  1. MEG@VOLT

    MEG@VOLT ★★★★★★★
    Модератор

    Регистрация:
    24 мар 2006
    Сообщения:
    1.721
    Благодарности:
    746
    Баллы:
    290
    Введение

    Данная статья посвящена конвертированию, нередко у модостроителей возникает необходимость вставить в свое творение(мод) какого-либо НПЦ из другой части игры. Эта же необходимость, возникла и у меня при разработке модификации 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
     
    BalBes и Валера поблагодарили.
Статус темы:
Закрыта.

Поделиться этой страницей